二叉树——17.二叉搜索树中的插入操作

2024-08-22 00:44

本文主要是介绍二叉树——17.二叉搜索树中的插入操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

力扣题目链接

给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据保证,新值和原始二叉搜索树中的任意节点值都不同。

注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回任意有效的结果。

解题思路

1. 理解二叉搜索树(BST)的性质

首先,需要理解二叉搜索树的基本性质:

  • 对于每个节点,左子树中所有节点的值都小于该节点的值。
  • 右子树中所有节点的值都大于该节点的值。
  • 因此,插入一个新值时,需要遵循这个规则,找到适合的位置。

2. 递归遍历寻找插入位置

为了找到新节点的插入位置,采用递归遍历树的方式:

  • 从根节点开始,比较当前节点的值与要插入的值。
    • 如果插入值小于当前节点的值,则进入左子树继续寻找。
    • 如果插入值大于当前节点的值,则进入右子树继续寻找。
  • 当找到一个空的子节点(即当前节点的子节点为 None)时,说明这是合适的插入位置。

3. 插入新节点

在递归遍历过程中,保持对当前节点的父节点的引用(parent)。当找到合适的插入位置时,根据插入值与父节点的比较结果,将新节点插入为父节点的左子节点或右子节点。

4. 处理特殊情况

在树为空的情况下,直接将新节点作为根节点返回。

5. 总体解题思路总结

  • 利用递归来遍历树,直到找到合适的插入位置。
  • 通过保持对父节点的引用,确保新节点可以正确地插入到树中。
  • 特殊情况下,直接处理空树并返回新的根节点。

这个思路的核心是利用二叉搜索树的性质和递归的思想,以保证插入操作符合 BST 的规则。

完整代码如下:

class Solution:def __init__(self):self.parent = Nonedef traversal(self, cur, val):if cur is None:node = TreeNode(val)if val > self.parent.val:self.parent.right = nodeelse:self.parent.left = nodereturnself.parent = curif cur.val > val:self.traversal(cur.left, val)if cur.val < val:self.traversal(cur.right, val)def insertIntoBST(self, root, val):self.parent = TreeNode(0)if root is None:return TreeNode(val)self.traversal(root, val)return root
def traversal(self, cur, val):if cur is None:node = TreeNode(val)if val > self.parent.val:self.parent.right = nodeelse:self.parent.left = nodereturnself.parent = curif cur.val > val:self.traversal(cur.left, val)if cur.val < val:self.traversal(cur.right, val)
  • 基准条件判断:

    • 如果 curNone,说明我们已经找到适合插入的位置。此时:
      • 创建一个新的 TreeNode,其值为 val
      • 根据 valself.parent.val 的比较结果,将新节点插入为 self.parent 的左子节点或右子节点。
      • 然后返回结束递归。
  • 递归遍历:

    • 在未找到插入位置时,继续沿着树遍历:
      • 当前节点的值 (cur.val) 大于 val 时,递归遍历当前节点的左子树。
      • 当前节点的值 (cur.val) 小于 val 时,递归遍历当前节点的右子树。
    • 在递归前更新 self.parent 为当前节点 cur,以便跟踪新节点的父节点。
def insertIntoBST(self, root, val):self.parent = TreeNode(0)if root is None:return TreeNode(val)self.traversal(root, val)return root
  • 初始化父节点:

    • 在执行插入操作前,将 self.parent 初始化为一个新的节点(值为0)。这个初始化操作主要为了处理边界情况,确保在整个插入过程中 parent 有合理的值。
  • 特殊情况处理:

    • 如果树为空(rootNone),直接返回一个新的节点作为根节点。
  • 调用 traversal 方法:

    • 否则,调用 traversal 方法,从根节点开始遍历,找到适合插入的位置并插入新节点。
  • 返回根节点:

    • 最后,返回操作后的树的根节点。

这篇关于二叉树——17.二叉搜索树中的插入操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1094759

相关文章

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Redis中管道操作pipeline的实现

《Redis中管道操作pipeline的实现》RedisPipeline是一种优化客户端与服务器通信的技术,通过批量发送和接收命令减少网络往返次数,提高命令执行效率,本文就来介绍一下Redis中管道操... 目录什么是pipeline场景一:我要向Redis新增大批量的数据分批处理事务( MULTI/EXE

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.