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

二叉搜索树(Binary Search Tree, BST)是一种特殊的二叉树数据结构

二叉搜索树(Binary Search Tree, BST)是一种特殊的二叉树数据结构,其核心性质是:对于树中任意节点,其左子树中所有节点的值均小于该节点的值,右子树中所有节点的值均大于该节点的值,且左右子树本身也均为BST(递归定义)。这一性质保证了中序遍历BST可得到严格递增的有序序列。

BST支持高效的基本操作(平均时间复杂度为 O(log n),最坏退化为链表时为 O(n)):

  • 查找(Search):从根开始,比较目标值与当前节点值,小于则向左,大于则向右,等于则命中;
  • 插入(Insert):沿查找路径找到空位置后插入新节点,维持BST性质;
  • 删除(Delete):分三种情况处理——无子节点(直接删)、仅一个子节点(用子节点替代)、两个子节点(用中序前驱或后继替换,再递归删除该前驱/后继);
  • 中序遍历(In-order Traversal):输出升序序列,常用于排序或范围查询。

BST是许多高级数据结构(如AVL树、红黑树)的基础,广泛应用于数据库索引、字典实现、动态集合操作等场景。

classTreeNode:def__init__(self,val=0,left=None,right=None):self.val=val self.left=left self.right=rightdefsearch_bst(root,target):ifnotrootorroot.val==target:returnrootiftarget<root.val:returnsearch_bst(root.left,target)else:returnsearch_bst(root.right,target)definsert_bst(root,val):ifnotroot:returnTreeNode(val)ifval<root.val:root.left=insert_bst(root.left,val)elifval>root.val:root.right=insert_bst(root.right,val)returnroot# 若val已存在,不重复插入(可根据需求调整)

在二叉搜索树(BST)中,删除操作需在移除目标节点的同时严格维持BST性质(即左子树所有值 < 当前节点 < 右子树所有值)。根据待删除节点的子节点数量,分为以下三种情况,每种情况的处理逻辑如下:


✅ 情况1:节点为叶子节点(无子节点)

  • 逻辑:直接删除该节点,将其父节点指向它的指针置为None
  • 说明:不破坏任何BST结构,最简单情形。

✅ 情况2:节点仅有一个子节点(左或右子树非空,另一个为空)

  • 逻辑:用其唯一子节点替代该节点位置(即让父节点直接指向该子节点)。
  • 说明:由于BST性质在单支路径上天然保持(如parent < node < right_childleft_child < node < parent),替换后仍满足BST约束。

✅ 情况3:节点有两个子节点(左右子树均非空)

  • 核心思想:需选择一个语义等价且可安全上移的替代节点——即其中序前驱(左子树中的最大值)或中序后继(右子树中的最小值)。二者均与原节点值“相邻”,替换后能无缝维持有序性。
  • 标准做法(常用中序后继)
    1. 在右子树中找到最小节点(即一直向左走到叶子);
    2. 用该后继节点的值覆盖待删节点的值
    3. 递归删除该后继节点(它必为叶子或仅有一个右子节点——因它是右子树最左节点,故无左子树)。
  • 等价做法(用中序前驱):在左子树中找最大节点(一直向右),同理覆盖并删除。
  • 关键点:不直接交换节点对象,而是值覆盖 + 删除冗余节点,避免指针重连复杂性。

🌟 补充说明:

  • 重复值处理:若BST允许重复值(如插入到右子树),删除时通常只删第一个匹配节点;若定义为“不允许重复”,则查找唯一匹配即可。
  • 实现要点:需在递归/迭代中维护父节点引用(或返回新子树根),以便修改父指针;Python中常采用返回更新后的子树根节点方式实现(见下方代码示例)。
defdelete_node(root,key):ifnotroot:returnNoneifkey<root.val:root.left=delete_node(root.left,key)elifkey>root.val:root.right=delete_node(root.right,key)else:# 找到待删节点ifnotroot.left:# 情况1或2:无左子树 → 返回右子树(含空)returnroot.rightifnotroot.right:# 情况1或2:无右子树 → 返回左子树returnroot.left# 情况3:双子树 → 用中序后继(右子树最小值)替换successor=root.rightwhilesuccessor.left:successor=successor.left root.val=successor.val# 值覆盖root.right=delete_node(root.right,successor.val)# 删除后继(必为情况1或2)returnroot

http://www.jsqmd.com/news/1388694/

相关文章:

  • 技术项目如何通过跑通底层逻辑与最小验证闭环实现价值沉淀
  • 武汉自动意志科技有限公司:人工智能应用软件开发:模拟案例:用户决策与落地结果如何从问题推进到交付验收
  • 幻兽帕鲁存档转换工具 palworld-save-tools:5分钟把 Level.sav 变成可编辑 JSON
  • 什么是数据采集?方法、类型和示例
  • 宜选科技构建“五层数字增长架构” 打造外贸企业智能获客新体系
  • 把B站大会员4K视频变成本地文件:一个值得收藏的下载工具全解析
  • 清远城乡住房建设部网站如何助力百姓安居:从政策解读到民生保障的深度解析
  • 深耕细节与坚守初心:揭秘一家优秀网站建设公司企业文化的内核力量
  • 2026年济南推荐沙盘制作厂如何选?建议了解济南中聚模型有限公司(济南办事处) - 品牌优推
  • 2026年8月湘潭市联通300M单宽带实测办理全流程 - 找卡家园
  • 揭秘行业黑幕,一份专业的网站建设报价模版让你不再被宰
  • Minecraft服务器性能终极优化:地狱空置域工程实践指南
  • Qt QProcess封装调用FFmpeg实现高效批量视频截图工具
  • 2026年潮汕睡衣家居服高端吊牌生产源头厂家认准普宁市南径鹏艺纸制品厂(潮汕销售中心) - 品牌优推
  • FFmpeg终极指南:高质量MP4转GIF与批量自动化方案
  • 文本分析项目部署与验证指南:从NLP原理到工程实践
  • 2026年来宾创新仙粮碾米机选购指南|广西伟农农业机械有限公司(来宾营销部) - 品牌优推
  • 从零构建嵌入式低延迟视频流媒体系统:V4L2+FFmpeg+RTP实战
  • 实验试剂采购平台怎么选?从搜索到验收的效率提升指南
  • .AI 千人大会重磅嘉宾名单(杭州首站)
  • 销售团队持续扩展时,CRM 如何选择
  • 思源宋体CN:7字重专业中文字体深度配置策略指南
  • 一套代码让Arduino与树莓派隔空对话:RF24跨平台无线通信实战
  • Idle Master挂卡工具怎么用?跟着三个真实场景跑通Steam交易卡自动掉落
  • Windows C/C++命令行编译实战:从cl.exe基础到多文件项目构建
  • Unity游戏多语言终极解决方案:XUnity.AutoTranslator完整使用指南
  • 无线电探测和声波定位板卡设计原理图:FMC303-两路5.6Gsps 14bit DA FMC子卡
  • Minimax abab-6.5-2.7深度测评:AI编程助手如何从玩具升级为实用工具
  • 黄金曼特宁那么多,怎么分辨是不是正宗PWN? - 咖评官方推荐
  • 镜头MTF曲线解析:原理、测试与应用