给定二叉搜索树(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中不存在。
方法一:模拟
思路与算法
首先回顾二叉搜索树的性质:对于任意节点 root 而言,左子树(如果存在)上所有节点的值均小于 root.val,右子树(如果存在)上所有节点的值均大于 root.val,且它们都是二叉搜索树。
因此,当将 val 插入到以 root 为根的子树上时,根据  val 与 root.val 的大小关系,就可以确定要将 val 插入到哪个子树中。
- 如果该子树不为空,则问题转化成了将 val 插入到对应子树上。
- 否则,在此处新建一个以 val 为值的节点,并链接到其父节点 root 上。
代码
[sol1-C++]| 12
 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]| 12
 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]| 12
 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]| 12
 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]| 12
 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]| 12
 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;
 }
 
 | 
 复杂度分析