LeetCode 701. 二叉搜索树中的插入操作
难度: m i d d l e \color{orange}{middle} middle
题目描述
给定二叉搜索树(BST)的根节点 r o o t root root 和要插入树中的值 v a l u e value 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]
提示:
- 树中的节点数将在 [ 0 , 1 0 4 ] [0, 10^{4}] [0,104]的范围内。
- − 1 0 8 < = N o d e . v a l < = 1 0 8 -10^{8} <= Node.val <= 10^{8} −108<=Node.val<=108
- 所有值 N o d e . v a l Node.val Node.val 是 独一无二 的。
- − 1 0 8 < = v a l < = 1 0 8 -10^{8} <= val <= 10^{8} −108<=val<=108
- 保证 v a l val val 在原始BST中不存在。
算法1
(递归)
- 若
root
为空则返回当前val
值的新节点; - 若
root.val > val
,说明需要在左边插入一个新的节点,递归左子树; - 若
root.val < val
,说明需要在右边插入一个新的节点,递归右子树。
复杂度分析
-
时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉搜索树的节点数。
-
空间复杂度 : O ( n ) O(n) O(n)
C++ 代码
/**
* 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) return new TreeNode(val);
if (root->val > val) root->left = insertIntoBST(root->left, val);
else root->right = insertIntoBST(root->right, val);
return root;
}
};
算法2
(数据结构基础、模拟)
- 按照二叉搜索树的性质,自顶向下查找插入的位置。
- 如果查找过程中发现相同的值,则直接返回。
- 如果
val
小于当前结点的值,则向左儿子查找;否则向右儿子查找,最后插入到叶结点上。 - 注意树为空的情况。
复杂度分析
-
时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉搜索树的节点数。
-
空间复杂度 : O ( n ) O(n) O(n),只需要新创建一个待插入的结点。
C++ 代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
if (!root)
return new TreeNode(val);
TreeNode *cur = root, *fa = NULL;
while (cur) {
if (val == cur -> val)
return root;
else if (val < cur -> val) {
fa = cur;
cur = cur -> left;
} else {
fa = cur;
cur = cur -> right;
}
}
if (val < fa -> val)
fa -> left = new TreeNode(val);
else
fa -> right = new TreeNode(val);
return root;
}
};
相关文章
- Java实现 LeetCode 791 自定义字符串排序(桶排序)
- Java实现 LeetCode 783 二叉搜索树节点最小距离(遍历)
- Java实现 LeetCode 762 二进制表示中质数个计算置位(位运算+JDK的方法)
- Java实现 LeetCode 701 二叉搜索树中的插入操作(遍历树)
- Java实现 LeetCode 700 二叉搜索树中的搜索(遍历树)
- Java实现 LeetCode 657 机器人能否返回原点(暴力大法)
- Java实现 LeetCode 629 K个逆序对数组(动态规划+数学)
- Java实现 LeetCode 501 二叉搜索树中的众数
- Java实现 LeetCode 211 添加与搜索单词 - 数据结构设计
- Java实现 LeetCode 109 有序链表转换二叉搜索树
- Java实现 LeetCode 72 编辑距离
- Java实现 Leetcode 169 求众数
- Java实现 LeetCode 240 搜索二维矩阵 II
- LeetCode(109):有序链表转换二叉搜索树
- LeetCode(89):格雷编码
- 每日一道 LeetCode (43):翻转二进制数
- LeetCode(120):三角形最小路径和
- LeetCode(35):搜索插入位置
- LeetCode-面试题 04.06. 后继者【中序遍历,二叉搜索树性质】
- ( “树” 之 BST) 230. 二叉搜索树中第K小的元素 ——【Leetcode每日一题】
- [LeetCode] 33. 搜索旋转排序数组 ☆☆☆(二分查找)
- [LeetCode] 98. Validate Binary Search Tree(是否是二叉搜索树) ☆☆☆
- [LeetCode] 41. First Missing Positive ☆☆☆☆☆(第一个丢失的正数)
- 【Mac系统】Vscode使用LeetCode插件报错‘leetcode.toggleLeetCodeCn‘ not found
- 【Leetcode刷题Python】74. 搜索二维矩阵
- 【Leetcode刷题Python】134. 加油站