【leetcode】701. 二叉搜索树中的插入操作(insert-into-a-binary-search-tree)(dfs)[中等]

2023-05-16

链接

https://leetcode-cn.com/problems/insert-into-a-binary-search-tree/

耗时

解题:21 min
题解:6 min

题意

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

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

思路

利用二叉搜索树(BST)性质,从根节点开始,将当前节点值和插入值比较,如果插入值小就去左子树找,否则就去右子树找,直到找到第一个空节点,新建一个树节点,替换这个空节点位置。

时间复杂度: O ( n ) O(n) O(n),最坏情况下需遍历整棵树

AC代码

1. dfs

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
private:
    int val;
public:
    void dfs(TreeNode* root) {
        if(val < root->val) {
            if(root->left != NULL) {
                dfs(root->left);
            }
            else {
                TreeNode* s = new TreeNode(val);
                root->left = s;
            }
        }
        else if(val > root->val) {
            if(root->right != NULL) {
                dfs(root->right);
            }
            else {
                TreeNode* s = new TreeNode(val);
                root->right = s;
            }
        }
    }
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        if(root == NULL) return new TreeNode(val);
        this->val = val;
        dfs(root);
        return root;
    }
};

2. 迭代

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        if(root == NULL) return new TreeNode(val);
        TreeNode* now = root;
        TreeNode* parent;
        bool isleft = false;
        while(now != NULL) {
            parent = now;
            if(val < now->val) {
                now = now->left;
                isleft = true;
            }
            else {
                now = now->right;
                isleft = false;
            }
        }
        TreeNode* s = new TreeNode(val);
        if(isleft) parent->left = s;
        else parent->right = s;
        return root;
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【leetcode】701. 二叉搜索树中的插入操作(insert-into-a-binary-search-tree)(dfs)[中等] 的相关文章

  • Grails: .save(flush:flush, insert:true) 与 .save(flush:true) 有何不同

    在spring security生成的类中UserRole or SecUserSecRole 你可以随意称呼它 有一个命令可以创建一个new UserRole 并保存它 save flush flush insert true 这意味着什
  • 以 4 为底的二进制 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何将数字从二进制转换为基数 4wi
  • 按排序顺序将元素插入数组

    我正在尝试按排序顺序将元素添加到数组中 这是我的代码 public class SortedInsertion public static void main String args int arr new int 6 arr 0 5 ar
  • 反斜杠零分隔符 '\0'

    我见过 0 用作混合二进制文件 UTF8 字符串 二进制数据 中的分隔符 谁能解释一下什么 0 意味着或指向一个好的学习场所 这是空字符 更多信息请参见此维基百科article http en wikipedia org wiki Null
  • 插入带有扭曲问题的选择

    我想将一个表 当然具有某个ID 的所有数据复制到同一个表中 但略有不同 我有这个表 产品数量 id groupId productId quantity 1 2 2 5 我想要做的是复制 groupId 2 的所有数据 将其插入到 grou
  • 在汇编程序中将十进制转换为二进制

    我的第一个汇编程序需要帮助 我必须将用户输入的值从十进制转换为二进制 我不知道如何将值显示为小数 以及下一步应该做什么 谁能一步一步指导我下一步做什么 model small stack 100h data txt1 db Enter bi
  • 在 Swift 中,如何将现有的二进制文件读入数组?

    作为我的项目的一部分 我有一个二进制数据文件 其中包含大量 32 位整数 我的一个类在初始化时读入该文件 在我的 C 库中 我使用以下初始化程序读入它 Evaluator Evaluator m HandNumbers resize 324
  • 为什么 std::bitset<8> 变量无法处理 11111111?

    为什么这个程序显示以下输出 include
  • 如何从 bash 查看二进制文件?

    我想从命令行查看当前目录中文件的内容 但以二进制形式查看 我怎样才能实现这个目标 xxd https linux die net man 1 xxd既可以是二进制 也可以是十六进制 bin xxd b file hex xxd file
  • SQL插入相关表

    在我看来 这似乎是 SQL 数据库开发中经常出现的问题 但我对这一切都是新手 所以请原谅我的无知 我有 2 张桌子 CREATE TABLE dbo Tracks TrackStringId bigint NOT NULL Id bigin
  • 在 R 中将因子矩阵转换为二进制(指标)矩阵的最有效方法

    我可以想到几种方法来转换这种类型的矩阵 数据框 dat data frame x1 rep c a b 100 x2 rep c x y 100 head dat x1 x2 1 a x 2 b y 3 a x 4 b y 5 a x 6
  • 如何查找数字的二进制表示形式中 1 的个数?

    从其他搜索中 我发现这个问题被称为 汉明权重 或 人口计数 这么多的统计数据已经给出了很多答案吗 我需要以简单的方式找到解决方案吗 复杂性并不是什么大问题 JavaScript 中是否有像 Java 的 Integer bitCount 这
  • 动态创建临时表,插入临时表,然后select

    基本上我希望能够根据现有表动态创建临时表 然后将值插入到临时表中 然后选择插入的值 我已经得到了可以创建临时表的部分 工作得很好 只是插入和选择表单的效果不太好 这是我当前的代码 declare table table OrdinalPos
  • 如果两个字段存在则更新,如果不存在则插入(MySQL)

    这不是 精确 复制这个问题 https stackoverflow com questions 4205181 insert to table or update if exists mysql所以我开始了一个新的 我有这个表 ID是主要的
  • Java:如何将哈希图插入 MongoDB?

    我有一个哈希图 我试图将其插入到 MongoDB 版本 3 6 中 我知道 insertMany 方法 它只接受文档列表 我无法创建列表 因为我的数据中有重复项 我想删除它们 这就是我创建哈希图的原因 有什么办法可以将 hashmap 插入
  • 如何将 std::map 输出到二进制文件?

    我怎样才能输出一个std map到二进制文件 地图声明如下所示 map
  • 如何使用 JDBC 将大型(或至少是重要的)BLOB 放入 Oracle 中?

    我正在开发一个应用程序来执行一些批处理 并且希望将输入和输出数据作为文件存储在 Oracle 数据库的 BLOB 字段中 Oracle版本是10g r2 使用如下的PreparedStatement setBinaryStream 方法会将
  • SQL Server:是否可以同时插入两个表?

    我的数据库包含三个表 称为Object Table Data Table and Link Table 链接表仅包含两列 对象记录的标识和数据记录的标识 我想从中复制数据DATA TABLE它链接到一个给定的对象标识并将相应的记录插入到Da
  • 是否存在 UTF-8 编码中未使用的字节?

    据我了解 UTF 8 是 ASCII 的超集 因此包括不用于表示可打印字符的控制字符 我的问题是 是否有任何字节 256 个不同的字节 未被 UTF 8 编码使用 我想知道你是否可以转换 编码UTF 8 文本转二进制 这是我的思考过程 我不
  • MySQL INSERT 无需指定每个非默认字段(#1067 - “表”的默认值无效)

    我已经见过好几次了 我有一台服务器允许我插入一些值 而无需指定其他值 如下所示 INSERT INTO table SET value a a value b b value c 是一个没有设置默认值的字段 但在这里工作正常 当脚本移动到新

随机推荐