二叉树删除节点
1)若果删除的节点是叶子节点,则删除该节点
2)如果删除的节点是非叶子节点,则删除该树
思路:
1.如果这个树是空树,如果只有root结点,则等价于将二叉树置空
2.所以,我们是判断当前节点的子结点是否是需要删除的节点,而不能去判断当前这个结点是不是需
要删除的结点
3.如果当前节点的左子结点不为空,并且左子节点就是要删除的结点,就将this.left=null
4.如果当前节点的右子结点不为空,并且右子节点就是要删除的结点,就将this.right=null
5.如果第二步第三步都没有删除结点,我们就需要向左子树进行递归删除
6.如果第四步都没有删除这个结点就向右子树进行递归删除
代码实现
HeroNode中的方法
//递归删除结点
//如果删除的结点是叶子结点,则删除该结点
//如果删除的结点是非叶子结点,则删除该树
public void delNode(int no){
//3.如果当前节点的左子结点不为空,并且左子节点就是要删除的结点,就将this.left=null
if (this.left!=null&&this.left.no==no){
this.left=null;
return;
}
//4.如果当前节点的右子结点不为空,并且右子节点就是要删除的结点,就将this.right=null
if (this.right!=null&&this.right.no==no){
this.right=null;
return;
}
//5.如果第二步第三步都没有删除结点,我们就需要向左子树进行递归删除
if (this.left!=null){
this.left.delNode(no);
}
//6.如果第四步都没有删除这个结点就向右子树进行递归删除
if (this.right!=null){
this.right.delNode(no);
}
}
BinaryTree中的代码
//删除结点
public void delNode(int no){
if (root!=null){
//这里就要立即判断root是不是要删除的结点
if (root.getNo()==no){
root=null;
}else {
root.delNode(no);
}
}else{
System.out.println("空树不能删除");
}
}
但是这样删除二叉树,如果删除左边节点还是会在右边节点递归一遍