当前位置: 首页 > news >正文

二叉排序树的插入和删除操作(python实现)

二叉排序树的插入和删除操作都是在保持二叉排序树特性的前提下进行的。

插入操作:

在二叉排序树中插入一个新节点时,先比较新节点的值和当前节点的值的大小关系,若小于当前节点,则继续在当前节点的左子树中查找;若大于当前节点,则继续在当前节点的右子树中查找。重复该过程,直到找到一个空节点,将新节点插入到该位置上。

删除操作:

删除操作比较复杂,需要分类讨论。

若待删除节点为叶子节点,直接删除即可。
若待删除节点只有一个子节点,将其子节点替代自身即可。
若待删除节点有两个子节点,则需要寻找其右子树中的最小值节点或左子树中的最大值节点来替代自身,然后再将该最小值节点或最大值节点删除。

具体过程如下:

  • 在二叉排序树中查找待删除节点,并记录其父节点;
  • 对待删除节点进行分类讨论,若为叶子节点或只有一个子节点,则直接删除;
  • 若待删除节点有两个子节点,则找到其右子树中的最小值节点,或左子树中的最大值节点;
  • 将该最小值节点或最大值节点替代待删除节点,并将其子节点链接到其父节点上; 若待删除节点为根节点,则替换根节点。
  • 需要注意的是,在删除节点之后,为了保持二叉排序树的特性,需要对该节点的父节点及其祖先节点进行平衡调整。
class Node:def __init__(self, key):self.left = Noneself.right = Noneself.key = keydef insert(root, key):if root is None:return Node(key)if key < root.key:root.left = insert(root.left, key)elif key > root.key:root.right = insert(root.right, key)return rootdef minValueNode(node):current = nodewhile(current.left is not None):current = current.leftreturn currentdef deleteNode(root, key):if root is None:return rootif key < root.key:root.left = deleteNode(root.left, key)elif(key > root.key):root.right = deleteNode(root.right, key)else:if root.left is None:temp = root.rightroot = Nonereturn tempelif root.right is None:temp = root.leftroot = Nonereturn temptemp = minValueNode(root.right)root.key = temp.keyroot.right = deleteNode(root.right, temp.key)return root
http://www.lryc.cn/news/60859.html

相关文章:

  • 算法记录 | Day35 贪心算法
  • coinex // 撮合引擎 逻辑流程 (两种数据源 初始化源和前端源)
  • CentOS7---部署LNMP数据存储到redis
  • Linux中的git命令行
  • 【C++】哈希表:开散列和闭散列
  • C技能树:Hello World
  • TryHackMe-Set(Windows渗透测试 | WinDefender免杀)
  • 信安大佬真的用kali吗?
  • 禁用表单元素:Layui框架下的实践与技巧
  • spring boot 访问HTML
  • WPF教程(四)--Dispatcher
  • ijkplayer 编译增加支持更多的音视频格式
  • TOP命令显示完整命令行信息
  • Spring6从入门到精通 第一章 带你玩转Spring
  • Apache POI 实现用Java操作Excel完成读写操作
  • 改善供应商关系的八种方法
  • 网络安全-CDN绕过寻找真实IP
  • 牛客网 HJ28 素数伴侣【二分图匹配,匈牙利算法】困难
  • 带你畅玩ChatGPT
  • ChatGPT探索系列之六:思考ChatGPT的未来发展趋势和挑战
  • TryHackMe-Year of the Fox(Linux渗透测试)
  • ChatGPT 如何获取API Key
  • 明面抵制,暗中布局 对于AI,马斯克的言行为何如此“割裂”?
  • 【微服务中间件学习】redis基础及项目使用
  • ORA-04021:等待锁定对象时发生超时
  • 【华为OD机试真题 C++】1066 - 新工号中数字的最短长度 | 机试题+算法思路+考点+代码解析
  • 【数字 IC / FPGA】 有关建立/保持时间计算的思考
  • 【Fluent】Run can not be started until validation issues are resolved.
  • 【进阶C语言】有关动态内存管理的经典笔试题(详细图文讲解)
  • 1.Java系列之基础面试题总结