给定二叉搜索树(BST)的根节点 root
和要插入树中的值 value
,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据
保证 ,新值和原始二叉搜索树中的任意节点值都不同。
注意 ,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。
示例 1:
**输入:** root = [4,2,7,1,3], val = 5
**输出:** [4,2,7,1,3,5]
**解释:** 另一个满足题目要求可以通过的树是:
![](https://assets.leetcode.com/uploads/2020/10/05/bst.jpg)
示例 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中不存在。
方法一:模拟
思路与算法
首先回顾二叉搜索树的性质:对于任意节点 root 而言,左子树(如果存在)上所有节点的值均小于 root.val,右子树(如果存在)上所有节点的值均大于 root.val,且它们都是二叉搜索树。
因此,当将 val 插入到以 root 为根的子树上时,根据 val 与 root.val 的大小关系,就可以确定要将 val 插入到哪个子树中。
- 如果该子树不为空,则问题转化成了将 val 插入到对应子树上。
- 否则,在此处新建一个以 val 为值的节点,并链接到其父节点 root 上。
代码
[sol1-C++]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Solution { public: TreeNode* insertIntoBST(TreeNode* root, int val) { if (root == nullptr) { return new TreeNode(val); } TreeNode* pos = root; while (pos != nullptr) { if (val < pos->val) { if (pos->left == nullptr) { pos->left = new TreeNode(val); break; } else { pos = pos->left; } } else { if (pos->right == nullptr) { pos->right = new TreeNode(val); break; } else { pos = pos->right; } } } return root; } };
|
[sol1-Java]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| class Solution { public TreeNode insertIntoBST(TreeNode root, int val) { if (root == null) { return new TreeNode(val); } TreeNode pos = root; while (pos != null) { if (val < pos.val) { if (pos.left == null) { pos.left = new TreeNode(val); break; } else { pos = pos.left; } } else { if (pos.right == null) { pos.right = new TreeNode(val); break; } else { pos = pos.right; } } } return root; } }
|
[sol1-Python3]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution: def insertIntoBST(self, root: TreeNode, val: int) -> TreeNode: if not root: return TreeNode(val) pos = root while pos: if val < pos.val: if not pos.left: pos.left = TreeNode(val) break else: pos = pos.left else: if not pos.right: pos.right = TreeNode(val) break else: pos = pos.right return root
|
[sol1-JavaScript]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| var insertIntoBST = function(root, val) { if (root === null) { return new TreeNode(val); } let pos = root; while (pos !== null) { if (val < pos.val) { if (pos.left === null) { pos.left = new TreeNode(val); break; } else { pos = pos.left; } } else { if (pos.right === null) { pos.right = new TreeNode(val); break; } else { pos = pos.right; } } } return root; };
|
[sol1-Golang]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| func insertIntoBST(root *TreeNode, val int) *TreeNode { if root == nil { return &TreeNode{Val: val} } p := root for p != nil { if val < p.Val { if p.Left == nil { p.Left = &TreeNode{Val: val} break } p = p.Left } else { if p.Right == nil { p.Right = &TreeNode{Val: val} break } p = p.Right } } return root }
|
[sol1-C]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| struct TreeNode* createTreeNode(int val) { struct TreeNode* ret = malloc(sizeof(struct TreeNode)); ret->val = val; ret->left = ret->right = NULL; return ret; }
struct TreeNode* insertIntoBST(struct TreeNode* root, int val) { if (root == NULL) { root = createTreeNode(val); return root; } struct TreeNode* pos = root; while (pos != NULL) { if (val < pos->val) { if (pos->left == NULL) { pos->left = createTreeNode(val); break; } else { pos = pos->left; } } else { if (pos->right == NULL) { pos->right = createTreeNode(val); break; } else { pos = pos->right; } } } return root; }
|
复杂度分析