231010刷题记录_二叉搜索树的插入和删除

231010刷题记录
参考代码代码随想录来刷的

关键词:二叉树、二叉搜索树的插入和删除

1 701.二叉搜索树中的插入操作

力扣题目链接
给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。

注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。
在这里插入图片描述
这题有一个思路比较简单,必定能够在叶子处插入。

public class Solution2 {
    public TreeNode insertIntoBST(TreeNode root, int val) {
        if (root == null)
            return new TreeNode(val);
        if (val > root.val)
            root.right = insertIntoBST(root.right, val);
        else
            root.left = insertIntoBST(root.left, val);
        return root;
    }
}

2 450.删除二叉搜索树中的节点

力扣题目链接
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

  1. 首先找到需要删除的节点;
  2. 如果找到了,删除它。

在这里插入图片描述
这道题的思路比较困难,有点复杂,编程不太难。
有以下五种情况:

  1. 第一种情况:没找到删除的节点,遍历到空节点直接返回了

  2. 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点

  3. 第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点

  4. 第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点

  5. 第五种情况:左右孩子节点都不为空,左子树、右子树补位都行。
    以右子树补位为例,左子树中所有结点值都小于右子树的,那么应该将左子树插入到右子树最左下角。因为一旦在一个结点往右,那么表示大于该节点的值。

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        if (root == null)
            // 1 树中不存在key
            return root;
        if (key > root.val) {
            root.right = deleteNode(root.right, key);
            return root;
        } else if (key < root.val) {
            root.left = deleteNode(root.left, key);
            return root;
        } else {
            if (root.left == null && root.right == null)
                // 2 要删除结点的左右子树都为空
                return null;
            else if (root.left == null)
                // 3 要删除结点的左子树为空,右子树不为空
                return root.right;
            else if (root.right == null)
                // 4 要删除结点的右子树为空,左子树不为空
                return root.left;
            else {
                // 5 要删除结点的左右子树都存在
                // 右子树去代替,并将左子树移动到右子树左下角去。
                TreeNode cur = root.right;
                while (cur.left != null)
                    cur = cur.left;
                cur.left = root.left;
                return root.right;
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值