题目31:701. 二叉搜索树中的插入操作
同类题目
前置知识
二叉搜索树(Binary Search Tree) :也叫做二叉查找树、有序二叉树或者排序二叉树。是指一棵空树或者具有下列性质的二叉树:
- 如果任意节点的左子树不为空,则左子树上所有节点的值均小于它的根节点的值。
- 如果任意节点的右子树不为空,则右子树上所有节点的值均大于它的根节点的值。
- 任意节点的左子树、右子树均为二叉搜索树。
题目描述
-
给定二叉搜索树(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]提示:
- 树中的节点数将在
[0, 104]的范围内。 -108 <= Node.val <= 108- 所有值
Node.val是 独一无二 的。 -108 <= val <= 108- 保证
val在原始BST中不存在。
- 树中的节点数将在
思路分析
迭代
对于二叉搜索,插入节点的步骤如下
-
如果二叉搜索树为空,则创建一个值为
val的节点,并将其作为二叉搜索树的根节点。 -
如果二叉搜索树不为空,则将待插入的值
val与二叉搜索树根节点的值root->val进行比较- 如果
val < cur->val,则cur = cur->left。 - 如果
val > cur->val,则cur = cur->right。
- 如果
程序代码
方法一:
// https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/description/
// 235. 二叉搜索树的最近公共祖先
#include<iostream>
#include<vector>
using namespace std;
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* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
while(root)
{
// 如果p和q的值都大于root的值,那么要找的节点在右子树中
if(p->val > root->val && q->val > root->val)
{
root = root->right;
}
// 如果p和q的值都小于root的值,那么要找的节点在左子树中
else if(p->val < root->val && q->val < root->val)
{
root = root->left;
}else
{
// 否则,说明p和q分别在root的两侧
break;
}
}
return root;
}
};
复杂度分析
时间复杂度:O(N),一共有 N个节点,最坏情况下,每个节点都要遍历一次。
空间复杂度:O(1) 。
思路分析
递归
对于二叉搜索,插入节点的步骤如下
-
如果二叉搜索树为空,则创建一个值为
val的节点,并将其作为二叉搜索树的根节点。 -
如果二叉搜索树不为空,则将待插入的值
val与二叉搜索树根节点的值root->val进行比较- 如果
val<root->val,则递归将值为val的节点插入到左子树中。 - 如果
val>root->val,则递归将值为val的节点插入到右子树中。
- 如果
程序代码
方法二:
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (root->val < p->val && root->val < q->val)
return lowestCommonAncestor(root->right, p, q);
if (root->val > p->val && root->val > q->val)
return lowestCommonAncestor(root->left, p, q);
return root;
}
};
复杂度分析
时间复杂度:O(N),一共有 N个节点,最坏情况下,每个节点都要遍历一次。
空间复杂度:O(N) , 最差情况下,即树退化为链表时,递归深度达到树的层数 N。
更多相关知识:github.com/pingguo1987…