二叉排序树(BST)Java 完整实现 + 删除思路详解

发布时间:2026/11/14 7:26:58

二叉排序树(BST)Java 完整实现 + 删除思路详解 一、二叉排序树核心特性左子树所有节点值根节点值右子树所有节点值根节点值中序遍历结果为升序数组核心操作新增、查找、遍历、删除重难点二、删除节点三大场景核心思路设待删除节点为target场景 1target 是叶子节点无左、无右孩子直接把父节点指向 target 的引用置为null释放节点。场景 2target 只有单侧子树只有左 / 只有右用 target 唯一的子节点顶替 target父节点直接指向该孩子。场景 3target 同时有左、右子树最复杂两种经典方案任选一种这里采用右子树最小值顶替找到 target右子树最小节点右子树最左下节点把最小节点的val赋值给 target覆盖待删值递归删除右子树中原来的最小节点最小节点一定满足场景 1/2替代方案取左子树最大值顶替逻辑完全对称。三、完整 Java 代码实现java运行/** * 二叉排序树节点类 */ class BSTNode { int val; BSTNode left; BSTNode right; public BSTNode(int val) { this.val val; this.left null; this.right null; } } /** * 二叉排序树工具类封装增、删、查、遍历 */ public class BinarySortTree { private BSTNode root; public BinarySortTree() { this.root null; } // 1. 添加节点 public void add(int val) { root addRecursion(root, val); } /** * 递归新增节点 */ private BSTNode addRecursion(BSTNode node, int val) { // 递归终止找到空位新建节点返回 if (node null) { return new BSTNode(val); } // 小于当前节点往左子树递归 if (val node.val) { node.left addRecursion(node.left, val); } // 大于当前节点往右子树递归 else if (val node.val) { node.right addRecursion(node.right, val); } // 相等二叉排序树不允许重复值直接返回原节点 else { return node; } return node; } // 2. 查找节点 public boolean search(int val) { return searchRecursion(root, val); } private boolean searchRecursion(BSTNode node, int val) { if (node null) { return false; } if (val node.val) { return true; } else if (val node.val) { return searchRecursion(node.left, val); } else { return searchRecursion(node.right, val); } } // 3. 中序遍历升序 public void inOrder() { System.out.print(中序遍历(升序)); inOrderRecursion(root); System.out.println(); } private void inOrderRecursion(BSTNode node) { if (node null) return; inOrderRecursion(node.left); System.out.print(node.val ); inOrderRecursion(node.right); } // 4. 删除节点核心方法 public void delete(int val) { root deleteRecursion(root, val); } /** * 递归删除目标值节点返回处理后的子树根节点 * param node 当前递归节点 * param val 待删除值 * return 删除后该分支新根 */ private BSTNode deleteRecursion(BSTNode node, int val) { // 递归终止未找到待删除节点 if (node null) { return null; } // 1. 待删值 当前节点向左递归删除 if (val node.val) { node.left deleteRecursion(node.left, val); return node; } // 2. 待删值 当前节点向右递归删除 else if (val node.val) { node.right deleteRecursion(node.right, val); return node; } // 3. val node.val找到待删除节点分3种情况处理 else { // 情况1叶子节点直接删除返回null if (node.left null node.right null) { return null; } // 情况2只有右孩子右孩子顶替当前节点 else if (node.left null) { return node.right; } // 情况2只有左孩子左孩子顶替当前节点 else if (node.right null) { return node.left; } // 情况3同时存在左右子树取右子树最小值顶替 else { // 步骤1获取右子树最小节点 BSTNode minNode getMinNode(node.right); // 步骤2用最小值覆盖待删除节点的值 node.val minNode.val; // 步骤3递归删除右子树中原最小节点 node.right deleteRecursion(node.right, minNode.val); return node; } } } /** * 获取一棵子树中的最小节点最左下节点 */ private BSTNode getMinNode(BSTNode node) { while (node.left ! null) { node node.left; } return node; } // 测试主方法 public static void main(String[] args) { BinarySortTree bst new BinarySortTree(); // 构建树5,3,7,2,4,6,8 int[] arr {5, 3, 7, 2, 4, 6, 8}; for (int num : arr) { bst.add(num); } bst.inOrder(); // 输出2 3 4 5 6 7 8 System.out.println( 删除叶子节点 2 ); bst.delete(2); bst.inOrder(); // 3 4 5 6 7 8 System.out.println( 删除单侧子树节点7只有右孩子8 ); bst.delete(7); bst.inOrder(); // 3 4 5 6 8 System.out.println( 删除左右都有子树的根节点5 ); bst.delete(5); bst.inOrder(); // 3 4 6 8 } }四、代码逻辑逐段解析1. 节点类 BSTNode存储数值、左右子节点引用基础实体类。2. add 新增逻辑递归向下查找空位小于当前节点 → 左子树大于当前节点 → 右子树相等直接忽略不支持重复值3. deleteRecursion 删除核心递归递归定位待删除节点小往左、大往右匹配到目标节点后分 3 种场景无左右孩子叶子return null父节点指向空只有单侧孩子直接返回唯一子节点完成顶替左右孩子都存在getMinNode找到右子树最小值覆盖当前节点值等价于 “删除原节点替换成最小值”递归删除右子树里原来的最小节点最小节点必然无左孩子属于场景 1/2。4. getMinNode 工具方法循环遍历左子树直到左为空得到当前子树最小值。5. 中序遍历验证二叉排序树中序遍历一定升序用来校验增删是否正确。五、运行输出结果plaintext中序遍历(升序)2 3 4 5 6 7 8 删除叶子节点 2 中序遍历(升序)3 4 5 6 7 8 删除单侧子树节点7只有右孩子8 中序遍历(升序)3 4 5 6 8 删除左右都有子树的根节点5 中序遍历(升序)3 4 6 8六、拓展补充删除方案替换如果想用「左子树最大值顶替」写getMaxNode取左子树最右节点即可非递归删除递归写法简洁易理解面试优先写递归非递归需要额外记录父节点、标记左右分支代码冗余重复值处理如需支持重复数字可在节点新增count计数删除时先减计数计数为 0 再执行删除逻辑。
延伸阅读

更多相关文章

2026/11/1 1:10:40

AI伦理架构:构建负责任的算法决策系统

1. 技术伦理的当代觉醒去年调试一个推荐算法时,我发现模型对某类用户持续输出负面内容。这个偶然发现让我意识到,算法工程师每天敲下的代码正在真实影响着数百万人的情绪。技术从来不是中立的工具,当AI开始具备自主决策能力时,我们…

2026/11/4 12:29:43

C++ STL学习指南:从入门到精通,书籍推荐与实战进阶

1. 项目概述:为什么我们需要一本好的STL书籍? 如果你用C写过一些项目,尤其是那些需要处理大量数据、追求性能或者仅仅是希望代码更优雅的项目,那你大概率已经接触过STL了。 vector , map , string ... 这些名字就像老朋友一…

2026/11/8 12:17:51

大模型在软件系统设计中的实用能力与评估方法

1. 先搞清楚让大模型设计软件系统到底能做什么如果你正在考虑用大语言模型来辅助软件系统设计,最需要先弄明白的不是哪个模型最强,而是它们到底能在设计流程中承担什么角色。我测试了6个主流大模型在软件系统设计任务上的表现,核心结论很直接…

2026/11/14 7:22:23

_南宁低压电工证费用最新政策解读

南宁低压电工证费用值不值得考?怕考不过白交培训费的看过来 你是不是也这样想: 怕考不过白交培训费 ,干脆就不去考了?其实,考低压电工证并不像你想的那么难,关键是了解清楚流程和费用,再结合自身情况判断 值不值得考…

2026/11/14 7:22:23

考验高级电工证怎么考最新政策解读

你拟定的标题 3个真实经历告诉你考验高级电工证怎么考最靠谱 不知道去哪报名怕被中介坑,这是很多想考取 考验高级电工证 的同行都会遇到的问题。我朋友老张去年就是在一家中介那里花了2000多块钱,结果拿回来的证书还是假的,折腾了大半年才补办成功…

2026/11/14 7:22:23

哪里考电工证简单些 电子证书怎么拿更稳妥

哪里考电工证简单些 电子证书怎么拿更稳妥 实操考试心里没底怕挂科,这是很多想考电工证的人共同的担忧。特别是对许昌应届工程类毕业生来说,电工证不仅是一份资质证明,更是进入相关行业的一把“钥匙”。不过,很多人不知道,现在考电工证并不复杂,尤其是…

2026/11/14 7:22:23

高压电工证怎么办?真实经历告诉你怎么避坑

高压电工证怎么办?真实经历告诉你怎么避坑 怕考不过白交培训费,这事儿我真遇到过。去年我一个老乡,花了几千块报了个高压电工证培训班,结果考试时被几个实操题卡住,最后没过,钱打水漂了。现在他一提到这事,还气得直跺脚。其实这类问题在咱们这个圈子里…

2026/11/14 7:17:23

电工证芯片有什么好处 低压电工证多久拿证

电工证芯片有什么好处 低压电工证多久拿证 学历不高怕报不上名?别急,电工证芯片有什么好处,拿证时间也快,关键还靠谱!不管你是刚入行的新人,还是想换赛道的老手,只要符合条件,就能报考低压电工证。各地市安全生产教育培训中心都有明确的报考标准,只…

2026/11/13 22:33:32

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/14 0:06:39

土木特种工考证官方报名入口怎么找 之前考的证在外省能不能转过来

土木特种工考证官方报名入口怎么找 之前考的证在外省能不能转过来 之前考的证在外省能不能转过来?这个问题我太熟悉了,作为一名干了十几年的特种作业证书办理从业者,每年都会遇到不少像你一样在外地考了证,回来却发现无法直接使用的学员。别急,今天我就…

2026/11/14 0:06:39

电工证要多久多钱保姆级教程:工地太忙根本没时间复习考试

电工证要多久多钱保姆级教程:工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,你不是一个人。在信阳浉河区,很多刚进入工地的电工都面临这样的困境:工作强度大,时间碎片化,根本没有系统复习考试的机会。但电工证是上岗的硬门槛,…

2026/11/13 22:32:11

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/13 12:14:39

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑