目 录CONTENT

文章目录

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

小王同学
2024-03-15 / 0 评论 / 0 点赞 / 31 阅读 / 0 字

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

力扣传送门(opens new window)

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

注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果

示例 1:

输入:root = [4,2,7,1,3], val = 5
输出:[4,2,7,1,3,5]
解释:另一个满足题目要求可以通过的树是:

示例 2:

输入:root = [40,20,60,10,30,50,70], val = 25
输出:[40,20,60,10,30,50,70,null,null,25]

示例 3:

输入:root = [4,2,7,1,3,null,null,null,null,null,null], val = 5
输出:[4,2,7,1,3,5]

解题思路:

递归法:

递归的写法还是简洁明了的,过程如下:

如果 root 是空,则新建树节点作为根节点返回即可。
否则比较 root.val 与目标值的大小关系:
如果 root.val 大于目标值,说明目标值应当插入 root 的左子树中,问题变为了在 root.left 中插入目标值,递归调用当前函数;
如果 root.val 小于目标值,说明目标值应当插入 root 的右子树中,问题变为了在 root.right 中插入目标值,递归调用当前函数。

代码实现:

class Solution {
    TreeNode pre;
    public TreeNode insertIntoBST(TreeNode root, int val) {
        if(root == null){
            TreeNode treeNode = new TreeNode(val);
            return treeNode;
        }
        pre = root;
        dfs(root,pre,val);
        return root;
    }

    public void dfs(TreeNode root,TreeNode pre, int val){
        if(root == null){
            TreeNode treeNode = new TreeNode(val);
            if(pre.val > val){
                pre.left = treeNode;
            }else{
                pre.right = treeNode;
            }
            return;
        }
        pre = root;
        if(val > root.val){
            dfs(root.right,pre,val);
        }else{
            dfs(root.left,pre,val);
        }
    }
}

简化版:

class Solution {
    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;
    }
}

迭代解法

如果 root 是空,则新建树节点作为根节点返回即可。
否则:
初始化 cur 指向 root。
比较 cur.val 与目标值的大小关系:
如果 cur.val 大于目标值,说明目标值应当插入 cur 的左子树中,如果 cur.left 为 null,表明这是目标值可以插入的位置,直接插入并返回即可;否则 cur 指向 cur.left,重复步骤 2;
如果 cur.val 小于目标值,说明目标值应当插入 cur 的右子树中。如果 cur.right 为 null,表明这是目标值可以插入的位置,直接插入并返回即可;否则 cur 指向 cur.right,重复步骤 2。

代码实现:

class Solution {
    public TreeNode insertIntoBST(TreeNode root, int val) {
        TreeNode node = new TreeNode(val);
        if (root == null) {
            return node;
        }

        TreeNode cur = root;
        while (true) {
            if (cur.val > val) {
                if (cur.left == null) {
                    cur.left = node;
                    break;
                }
                cur = cur.left;
            } else {
                if (cur.right == null) {
                    cur.right = node;
                    break;
                } 
                cur = cur.right;
            }
        }
        return root;
    }
}
0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区