二叉树——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

相关文章

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

C# 读写ini文件操作实现

《C#读写ini文件操作实现》本文主要介绍了C#读写ini文件操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、INI文件结构二、读取INI文件中的数据在C#应用程序中,常将INI文件作为配置文件,用于存储应用程序的

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

java Stream操作转换方法

《javaStream操作转换方法》文章总结了Java8中流(Stream)API的多种常用方法,包括创建流、过滤、遍历、分组、排序、去重、查找、匹配、转换、归约、打印日志、最大最小值、统计、连接、... 目录流创建1、list 转 map2、filter()过滤3、foreach遍历4、groupingB

Java操作PDF文件实现签订电子合同详细教程

《Java操作PDF文件实现签订电子合同详细教程》:本文主要介绍如何在PDF中加入电子签章与电子签名的过程,包括编写Word文件、生成PDF、为PDF格式做表单、为表单赋值、生成文档以及上传到OB... 目录前言:先看效果:1.编写word文件1.2然后生成PDF格式进行保存1.3我这里是将文件保存到本地后

Python使用Colorama库美化终端输出的操作示例

《Python使用Colorama库美化终端输出的操作示例》在开发命令行工具或调试程序时,我们可能会希望通过颜色来区分重要信息,比如警告、错误、提示等,而Colorama是一个简单易用的Python库... 目录python Colorama 库详解:终端输出美化的神器1. Colorama 是什么?2.

Python视频剪辑合并操作的实现示例

《Python视频剪辑合并操作的实现示例》很多人在创作视频时都需要进行剪辑,本文主要介绍了Python视频剪辑合并操作的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录介绍安装FFmpegWindowsMACOS安装MoviePy剪切视频合并视频转换视频结论介绍

Windows自动化Python pyautogui RPA操作实现

《Windows自动化PythonpyautoguiRPA操作实现》本文详细介绍了使用Python的pyautogui库进行Windows自动化操作的实现方法,文中通过示例代码介绍的非常详细,对大... 目录依赖包睡眠:鼠标事件:杀死进程:获取所有窗口的名称:显示窗口:根据图片找元素:输入文字:打开应用:依