一、前言
接着之前的一片博客![数据结构---二叉树(遍历查找)](https://img-blog.csdnimg.cn/18f94818961d473fb9b07fafa8b5ca74.png)
,接着后序写,本来是想重新编辑一下,写成一边博客,但是自我感觉,多写一篇博客会有成就感,哈哈哈哈哈(自恋勿cue)
二、思路
现在我有如下这样的二叉树:
我现在想删除其中的一个节点,比如2,或者5,有如下思路:
首先自定义删除规则:如果删除的是叶子节点直接删除叶子结点,如果要删除的不是叶子节点,比如:2,索性直接将2的两个左右子节点删除
分析:
要判断当前的root节点(上图的1号节点)是否为空,则输出此树为空树
root节点如果不为空,则判断root节点是否是要删除的节点
如果是,则直接将root节点置空
如果不是,则递归查找删除节点
三、代码
Node.java
/**
* 删除节点
* 自定义删除规则:
* 如果要删除的是叶子节点,直接删除,如果不是叶子节点,删除当前节点(后续的节点也直接删除,不考虑移动)
*/
public void delNode(int id) {
if (this.left != null && this.left.id == id) { // 如果当前节点的左子节点不为空或者当前节点的左子节点就是要删除的节点
this.left = null; // 删除当前节点的左子节点
return;
}
if (this.right != null && this.right.id == id) { //如果当前节点的右子节点不为空或者当前节点的右子节点就是要删除的节点
this.right = null;// 删除当前节点的右子节点
return;
}
// 递归查找
if (this.left != null) {
this.left.delNode(id);
}
// 递归查找
if (this.right != null) {
this.right.delNode(id);
}
}
BinaryTree.java
/**
* 删除节点
* @param id
*/
public void delNode(int id) {
if (this.root == null) {
System.out.println("当前树为空树");
} else{
if (this.root.getId() == id) { // 如果当前节点是要删除的节点
this.root = null;
} else {
this.root.delNode(id);
}
}
}
测试结果
补充:
如果要把删除节点的后续节点往上提,规定:把要删除节点的左子节点往上提
public void delNode(int id) {
if (this.left != null && this.left.id == id) { // 如果当前节点的左子节点不为空或者当前节点的左子节点就是要删除的节点
Node temp;
if (this.left.left != null) { // 将要删除节点的左子节点往上提
temp = this.left.left;
this.left = temp;
} else {
this.left = null; // 删除当前节点的左子节点
}
return;
}
if (this.right != null && this.right.id == id) { //如果当前节点的右子节点不为空或者当前节点的右子节点就是要删除的节点
this.right = null;// 删除当前节点的右子节点
return;
}
// 递归查找
if (this.left != null) {
this.left.delNode(id);
}
// 递归查找
if (this.right != null) {
this.right.delNode(id);
}
}