##### Welcome to Subscribe On Youtube
• /**

Given the root node of a binary search tree (BST) and a value to be inserted into the tree, insert the value into the BST. Return the root node of the BST after the insertion. It is guaranteed that the new value does not exist in the original BST.

Note that there may exist multiple valid ways for the insertion, as long as the tree remains a BST after insertion. You can return any of them.

For example,

Given the tree:
4
/ \
2   7
/ \
1   3
And the value to insert: 5
You can return this binary search tree:

4
/   \
2     7
/ \   /
1   3 5
This tree is also valid:

5
/   \
2     7
/ \
1   3
\
4

*/
public class Insert_into_a_Binary_Search_Tree {
/**
* Definition for a binary tree node.
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {

dfs(root, val);
return root;
}

private void dfs(TreeNode root, int val) {
if (root == null) {
root = new TreeNode(val);
return;
}

if (root.val < val) {

if (root.right != null) {
dfs(root.right, val);
} else {
root.right = new TreeNode(val);
}
}

if (root.val > val) {

if (root.left != null) {
dfs(root.left, val);
} else {
root.left = new TreeNode(val);
}
}
}
}
}

############

/**
* Definition for a binary tree node.
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode() {}
*     TreeNode(int val) { this.val = val; }
*     TreeNode(int val, TreeNode left, TreeNode right) {
*         this.val = val;
*         this.left = left;
*         this.right = right;
*     }
* }
*/
class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {
if (root == null) {
return new TreeNode(val);
}
if (root.val < val) {
root.right = insertIntoBST(root.right, val);
} else {
root.left = insertIntoBST(root.left, val);
}
return root;
}
}

• // OJ: https://leetcode.com/problems/insert-into-a-binary-search-tree/
// Time: O(H)
// Space: O(H)
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
if (!root) return new TreeNode(val);
if (val > root->val) root->right = insertIntoBST(root->right, val);
else root->left = insertIntoBST(root->left, val);
return root;
}
};

• # 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: TreeNode, val: int) -> TreeNode:
def dfs(root):
if root is None:
return TreeNode(val)
if root.val < val:
root.right = dfs(root.right)
else:
root.left = dfs(root.left)
return root

return dfs(root)

############

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
def insertIntoBST(self, root, val):
"""
:type root: TreeNode
:type val: int
:rtype: TreeNode
"""
if not root:
node = TreeNode(val)
return node
if val < root.val:
if not root.left:
node = TreeNode(val)
root.left = node
else:
self.insertIntoBST(root.left, val)
else:
if not root.right:
node = TreeNode(val)
root.right = node
else:
self.insertIntoBST(root.right, val)
return root

• /**
* Definition for a binary tree node.
* type TreeNode struct {
*     Val int
*     Left *TreeNode
*     Right *TreeNode
* }
*/
func insertIntoBST(root *TreeNode, val int) *TreeNode {
if root == nil {
return &TreeNode{Val: val}
}
if root.Val < val {
root.Right = insertIntoBST(root.Right, val)
} else {
root.Left = insertIntoBST(root.Left, val)
}
return root
}

• /**
* Definition for a binary tree node.
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {
TreeNode insert = new TreeNode(val);
TreeNode node = root;
while (node != null) {
if (node.val == val)
return node;
else if (node.val > val) {
if (node.left != null)
node = node.left;
else {
node.left = insert;
break;
}
} else {
if (node.right != null)
node = node.right;
else {
node.right = insert;
break;
}
}
}
return root;
}
}

############

/**
* Definition for a binary tree node.
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode() {}
*     TreeNode(int val) { this.val = val; }
*     TreeNode(int val, TreeNode left, TreeNode right) {
*         this.val = val;
*         this.left = left;
*         this.right = right;
*     }
* }
*/
class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {
if (root == null) {
return new TreeNode(val);
}
if (root.val < val) {
root.right = insertIntoBST(root.right, val);
} else {
root.left = insertIntoBST(root.left, val);
}
return root;
}
}

• // OJ: https://leetcode.com/problems/insert-into-a-binary-search-tree/
// Time: O(H)
// Space: O(H)
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
if (!root) return new TreeNode(val);
if (val > root->val) root->right = insertIntoBST(root->right, val);
else root->left = insertIntoBST(root->left, val);
return root;
}
};

• # 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: TreeNode, val: int) -> TreeNode:
def dfs(root):
if root is None:
return TreeNode(val)
if root.val < val:
root.right = dfs(root.right)
else:
root.left = dfs(root.left)
return root

return dfs(root)

############

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
def insertIntoBST(self, root, val):
"""
:type root: TreeNode
:type val: int
:rtype: TreeNode
"""
if not root:
node = TreeNode(val)
return node
if val < root.val:
if not root.left:
node = TreeNode(val)
root.left = node
else:
self.insertIntoBST(root.left, val)
else:
if not root.right:
node = TreeNode(val)
root.right = node
else:
self.insertIntoBST(root.right, val)
return root

• /**
* Definition for a binary tree node.
* type TreeNode struct {
*     Val int
*     Left *TreeNode
*     Right *TreeNode
* }
*/
func insertIntoBST(root *TreeNode, val int) *TreeNode {
if root == nil {
return &TreeNode{Val: val}
}
if root.Val < val {
root.Right = insertIntoBST(root.Right, val)
} else {
root.Left = insertIntoBST(root.Left, val)
}
return root
}