二叉树删除结点思路分析及代码实现
二叉树删除结点
思路分析
完成删除的操作
规定:
- 如果删除的结点是叶子节点,则删除该节点
- 如果删除的结点是非叶子节点,则删除该子树
思路:
- 因为我们的二叉树是单向的,所以我们是判断当前结点的子结点是否需要删除结点,而不能去判断当前这个结点是不是需要删除结点
- 如果当前结点的左子结点不为空,并且左子结点就是要删除结点,就将this.left=null;并且就返回(结束递归删除)
- 如果当前结点的右子结点不为空,并且右子结点就是要删除结点,就将this.right=null;并且就返回(结束递归删除)
- 如果第2和第3步没有删除结点,那么我们就需要向左子树进行递归删除
- 如果第4步也没有删除结点,则应当向右子树进行递归删除。
- 如果考虑树是空树root,如果只有一个root结点,则等价将二叉树置空
代码实现
删除方法delNode(int no):
// 递归删除结点
// 1. 如果删除的结点是叶子节点,则删除该节点
// 2. 如果删除的结点是非叶子节点,则删除该子树
public void delNode(int no) {
// 思路:
// 1. 因为我们的二叉树是单向的,所以我们是判断当前结点的子结点是否需要删除结点,而不能去判断当前这个结点是不是需要删除结点
// 2. 如果当前结点的左子结点不为空,并且左子结点就是要删除结点,就将this.left=null;并且就返回(结束递归删除)
// 3. 如果当前结点的右子结点不为空,并且右子结点就是要删除结点,就将this.right=null;并且就返回(结束递归删除)
// 4. 如果第2和第3步没有删除结点,那么我们就需要向左子树进行递归删除
// 5. 如果第4步也没有删除结点,则应当向右子树进行递归删除。
// 6. 如果考虑树是空树root,如果只有一个root结点,则等价将二叉树置空
// 2. 如果当前结点的左子结点不为空,并且左子结点就是要删除结点,就将this.left=null;并且就返回(结束递归删除)
if (this.left != null && this.left.no == no) {
this.left = null;
return;
}
// 3. 如果当前结点的右子结点不为空,并且右子结点就是要删除结点,就将this.right=null;并且就返回(结束递归删除)
if (this.right != null && this.right.no == no) {
this.right = null;
return;
}
// 4.先左子树进行递归删除
if (this.left != null) {
this.left.delNode(no);
// return
}
// 5.向右子树递归删除
if (this.right != null) {
this.right.delNode(no);
}
}
delNode(int no)方法的实现:
//删除结点
public void delNode(int no) {
if (root!=null) {
//如果只有一个root结点,立即判断root是不是要删除的结点
if(root.getNo()==no) {
root=null;
}else {
//递归删除
root.delNode(no);
}
}else {
System.out.println("空树,不能删除");
}
}