题目描述
给定二叉搜索树(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, 10^4]
的范围内。 -10^8 <= Node.val <= 10^8
- 所有值
Node.val
是 独一无二 的。 -10^8 <= val <= 10^8
- 保证
val
在原始BST中不存在。
思路
本题可以不考虑题目中提示所说的改变树的结构的插入方式。
递归法
递归三部曲:
- 确定递归函数的参数和返回值。参数就是根节点指针,以及要插入元素。本题可以有返回值也可以没有,但递归函数如果没有返回值的话,实现是比较麻烦的,有返回值的话,可以利用返回值完成新加入的节点与其父节点的赋值操作。
- 确定终止条件。终止条件就是找到遍历的节点为null的时候,就是要插入节点的位置了,并把插入的节点返回。
- 确定单层递归的逻辑。根据插入元素的数值,决定递归方向,下一层将加入节点返回,本层用root->left或者root->right将其接住。
代码
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 == NULL) {TreeNode* node = new TreeNode(val);return node;}if (root->val > val) root->left = insertIntoBST(root->left, val); // 插入新节点if (root->val < val) root->right = insertIntoBST(root->right, val); // 插入新节点return root;}
};
迭代法
/*** 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) {TreeNode* node = new TreeNode(val);return node;}TreeNode* cur = root;TreeNode* pre = root; while (cur != NULL) {pre = cur; // 需要记录上一个节点,否则无法赋值新节点if (cur->val > val) cur = cur->left;else cur = cur->right;}TreeNode* node = new TreeNode(val);if (val < pre->val) pre->left = node;// 用pre节点进行赋值else pre->right = node;return root;}
};
Python版:
递归法
python"># Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:# 递归法def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:if root is None:node = TreeNode(val)return nodeif root.val > val:root.left = self.insertIntoBST(root.left, val)if root.val < val:root.right = self.insertIntoBST(root.right, val)return root
需要注意的地方
1.在二叉搜索树中插入任何一个节点都可以在叶子结点中找到对应的位置。
2.本题使用了一个技巧:通过递归返回值来加入新节点。