LeetCode 450 删除二叉搜索树的节点

思路一:

先遍历树 如果当前节点不是要删除的节点则把当前节点返回给上一个节点   或者 遍历到空节点也返回给上一个节点

如果当前节点是要删除的节点 分几种情况

1. 如果被删除的节点 左子节点为空 就返回 右子节点 给前一个节点

2. 如果被删除的节点 右子节点为空 就返回 左子节点 给前一个节点

3. 如果左右子节点都不为空 就找到当前节点的 右子节点   迭代到他的最左下的子节点   把最左下的子节点赋值给被删除的节点   再把最左下的节点删除  

        删除最左下也有两种方法

        a. 继续使用 上述的方法 递归寻找

        b. 直接让它的子节点指向它的 上一个节点

        

代码如下:

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        root = delete(root,key);
        return root;
    }

    private TreeNode delete(TreeNode root, int key) {
        if (root == null) return null;

        if (root.val > key) {
            root.left = delete(root.left,key);
        } else if (root.val < key) {
            root.right = delete(root.right,key);
        } else {
            if (root.left == null) return root.right;
            if (root.right == null) return root.left;
            TreeNode tmp = root.right;
            while (tmp.left != null) {
                tmp = tmp.left;
            }
            root.val = tmp.val;
            root.right = delete(root.right,tmp.val);
        }
        return root;
    }
}

或者:

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        root = delete(root,key);
        return root;
    }

    private TreeNode delete(TreeNode root, int key) {
        if (root == null) return null;

        if (root.val > key) {
            root.left = delete(root.left,key);
        } else if (root.val < key) {
            root.right = delete(root.right,key);
        } else {
            if (root.left == null) return root.right;
            if (root.right == null) return root.left;
            TreeNode tmp = root.right;
            TreeNode pre = root.right.left;
            while (tmp.left != null) {
                
                if(tmp.left.left == null){
                    pre = tmp;
                }
                tmp = tmp.left;
            }
            root.val = tmp.val;
            if(pre == null){
                root.right =root.right.right;
            }else{
                pre.left = tmp.right;
            }
            
        }
        return root;
    }
}

思路二:

找到删除的节点  将他的右子节点 返回给它的上一个节点   再把他的左子节点指向 他最左下节点  最后把 它的左子节点设为空  

class Solution {
  public TreeNode deleteNode(TreeNode root, int key) {
    if (root == null) return root;
    if (root.val == key) {
      if (root.left == null) {
        return root.right;
      } else if (root.right == null) {
        return root.left;
      } else {
        TreeNode cur = root.right;
        while (cur.left != null) {
          cur = cur.left;
        }
        cur.left = root.left;
        root = root.right;
        return root;
      }
    }
    if (root.val > key) root.left = deleteNode(root.left, key);
    if (root.val < key) root.right = deleteNode(root.right, key);
    return root;
  }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值