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();
3.4测试结果
标签:结点,right,删除,递归,no,二叉树,null 来源: https://www.cnblogs.com/y-tao/p/16573953.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。