LC.701 | 二叉搜索树中的插入操作 | 树 | 迭代模拟

输入:
二叉搜索树的根节点 root 和一个待插入的整数 val

要求:
val 插入到二叉搜索树中,并保证插入后整棵树仍然满足 BST 的性质(左 < 根 < 右)。
题目保证新值和原始树中任意节点值都不同。

输出:
插入节点后的二叉搜索树的根节点。


思路:

在二叉搜索树中插入新节点,其实就是**“一次失败的查找”**。我们要找这个值应该在的位置,直到走到死胡同(空指针),那个位置就是它该待的地方。

本题解采用了 迭代(循环)法,相比递归不仅逻辑直观,而且空间复杂度更优。

  1. 特判空树
    如果根节点为空,直接用新值创建一个节点并返回,它就是新的根。

  2. 寻找插入位置(模拟)
    使用 while 循环遍历树,利用 BST 性质(val 大往右走,val 小往左走)。

    • 关键技巧 - “向前看一步”
      在决定向左还是向右移动之前,先检查那边的路是不是断的(即子节点是否为 null)。
      • 如果是 null,说明找到了!直接 new 一个节点接上去,任务完成,返回根节点。
      • 如果不是 null,则移动指针 root 继续向下寻找。

复杂度:

  • 时间复杂度:O(H)
    • 树的高度。我们需要从根遍历到叶子节点。
  • 空间复杂度:O(1)
    • 使用了迭代法,不需要递归栈,仅使用了常数个辅助变量。

class Solution {
public:
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        if (!root) {
            TreeNode* ans = new TreeNode(val);
            return ans;
        }
        TreeNode* ans = root;
        while (root) {
            if (root->val < val) {
                if (!root->right) {
                    TreeNode* tmp = new TreeNode(val);
                    root->right = tmp;
                    return ans;
                }
                else {
                    root = root->right;
                }
            }
            else {
                if (!root->left) {
                    TreeNode* tmp = new TreeNode(val);
                    root->left = tmp;
                    return ans;
                }
                else {
                    root = root->left;
                }
            }
        }
        return ans;
    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值