二叉树-删除节点
要求
1)如果删除的节点是叶子节点,则删除该节点
2)如果删除的节点是非叶子节点,则删除该子树.
思路:
首先考虑如果树是空树root,如果只有一个root结点,则等价将二叉树置空.
1).因为我们的二叉树是单向的,所以我们是判断当前结点的子结点是否需要删除结点,而不能去判断当前这个结点是不是需要删除结点。
2)如果当前结点的左子结点不为空,并且左子结点就是要删除结点,就将this.left=null;并且就返回(结束递归删除}
3).如果当前结点的右子结点不为空,并且右子结点就是要删除结点,就将this.right=null;并且就返回(结束递归删除)
4).如果第2和第3步没有删除结点,那么我们就需要向左子树进行递归删除.
5).如果第4步也没有删除结点,则应当向右子树进行递归删除.
代码实现
在上一篇的BinaryTreeDemo中添加如下的方法:
//3.递归删除节点
//1)如果删除的节点是叶子节点,则删除该节点
//2)如果删除的节点是非叶子节点,则删除该子树.
public void delNode(int no){
/**
* 首先考虑如果树是空树root,如果只有一个root结点,则等价将二叉树置空.
* 1).因为我们的二叉树是单向的,所以我们是判断当前结点的子结点是否需要删除结点,而不能去判断当前这个结点是不是需要删除结点。
* 2)如果当前结点的左子结点不为空,并且左子结点就是要删除结点,就将this.left=null;并且就返回(结束递归删除}
* 3).如果当前结点的右子结点不为空,并且右子结点就是要删除结点,就将this.right=null;并且就返回(结束递归删除)
* 4).如果第2和第3步没有删除结点,那么我们就需要向左子树进行递归删除.
* 5).如果第4步也没有删除结点,则应当向右子树进行递归删除.
*/
if(this.left != null && this.left.no == no){
this.left = null;
return;
}
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);
}
}
在Binary中添加删除节点的方法:
//删除结点
public void delNode(int no){
if(root != null){
//如果只有一个root,这里立即判断root是不是要删除的节点
if(root.getNo()==no){
root=null;
}else{
//递归删除
root.delNode(no);
}
}else{
System.out.println("空树!不能删除");
}
}