“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”
一、题目描述
给定二叉搜索树(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 的节点,并将其与它的父节点连接起来即可。
这里为什么只说要连接父节点呢?不用连接子节点吗?
其实不用,这跟插入的位置有关。如果插入的这个位置没有子节点,那么是不是只需要连接插入的节点与它的父节点即可。
那为什么插入的这个位置没有子节点呢?
这是因为①树在插入新值后仍保持为二叉搜索树,②插入的这个值与原始二叉搜索树中的任意节点值都不同,这就意味着这颗二叉搜索树一定有个地方是留给要插入的这个节点的。因此只要遍历到 左节点的值小于新值、右节点的值大于新值 的位置,就可以插入这个值了。
那怎么将新值与它的父节点连接起来呢?
由于我们是递归查看节点的,递归函数一定要有返回值,因此我们只要返回正确的节点,并接收这个返回值,即可实现新值与父节点的连接。
三、AC 代码
/**
* 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 -> right = insertIntoBST(root -> right, val);
} else if (root -> val > val) {
root -> left = insertIntoBST(root -> left, val);
}
return root;
}
};