二叉树删除结点
1.删除的规定(剩下的后面补充)
- 如果删除的是叶子结点,则删除该结点;
- 如果删除的结点是非叶子结点,则删除该子树
2.删除思路
- 首先,考虑如果树是空树root,或者只有一个结点,则等价于二叉树置空。
- 因为我们的二叉树是单向的,所以我们是判断当前结点的子结点是否需要删除,而不能去判断当前这个结点是不是需要删除该结点
- 如果当前结点的左子结点不为空,并且左子结点就是要删除的结点,就将this.left=null;并且返回结束递归;
- 如果当前结点的右子结点不为空,并且右子结点就是要删除的结点,就是将this.right=null;并且返回,结束递归;
- 如果第3步和第4步没有删除结点,那么需要向左子树进行递归删除
- 如果第5步也没有删除结点,则应当向右子树进行递归删除。
3.代码实现
3.1 在下图HeroNode位置增加删除方法
// 递归删除结点
public void delNode(int no){
// 如果当前结点的左子结点不为空,并且左子结点就是要删除的结点,就将this.left=null;并且返回结束递归;
if (this.left != null && this.left.no==no) {
this.left = null;
return;
}
// 如果当前结点的右子结点不为空,并且右子结点就是要删除的结点,就是将this.right=null;并且返回,结束递归;
if (this.right != null && this.right.no == no) {
this.right = null;
return;
}
// 前面的步骤都没有删除,继续向左递归删除
if (this.left != null) {
this.left.delNode(no);
}
// 前面的步骤都没有删除,继续向右递归删除
if (this.right != null) {
this.right.delNode(no);
}
}
3.2在二叉树BinaryTree位置增加删除方法
// 删除结点
public void delNode(int no){
if (root == null) {
System.out.println("空树,不能删除");
} else {
//不是空树,可以进行删除操作
//如果只有一个root结点,判断是不是要删除的结点
if (root.getNo() == no) {
root = null;
} else {
// 不止一个结点
// 递归删除
root.delNode(no);
}
}
}
3.3测试方法
//测试删除结点操作
System.out.println("删除前,前序遍历");
binaryTree.preOrder();
binaryTree.delNode(4);
System.out.println("删除后,前序遍历");
binaryTree.preOrder();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律