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

相关文章

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

使用Python的requests库来发送HTTP请求的操作指南

《使用Python的requests库来发送HTTP请求的操作指南》使用Python的requests库发送HTTP请求是非常简单和直观的,requests库提供了丰富的API,可以发送各种类型的HT... 目录前言1. 安装 requests 库2. 发送 GET 请求3. 发送 POST 请求4. 发送

Python使用python-pptx自动化操作和生成PPT

《Python使用python-pptx自动化操作和生成PPT》这篇文章主要为大家详细介绍了如何使用python-pptx库实现PPT自动化,并提供实用的代码示例和应用场景,感兴趣的小伙伴可以跟随小编... 目录使用python-pptx操作PPT文档安装python-pptx基础概念创建新的PPT文档查看

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

MySQL 数据库表与查询操作实战案例

《MySQL数据库表与查询操作实战案例》本文将通过实际案例,详细介绍MySQL中数据库表的设计、数据插入以及常用的查询操作,帮助初学者快速上手,感兴趣的朋友跟随小编一起看看吧... 目录mysql 数据库表操作与查询实战案例项目一:产品相关数据库设计与创建一、数据库及表结构设计二、数据库与表的创建项目二:员

Java Stream流以及常用方法操作实例

《JavaStream流以及常用方法操作实例》Stream是对Java中集合的一种增强方式,使用它可以将集合的处理过程变得更加简洁、高效和易读,:本文主要介绍JavaStream流以及常用方法... 目录一、Stream流是什么?二、stream的操作2.1、stream流创建2.2、stream的使用2.