[题目] : Given a binary search tree and a new tree node, insert the node into the tree. You should keep the tree still be a valid binary search tree.
Example
Given binary search tree as follow, after Insert node 6, the tree should be:
2 2
/ \ / \
1 4 --> 1 4
/ / \
3 3 6
方法一:基本递归算法
public class Solution {
/**
* @param root: The root of the binary search tree.
* @param node: insert this node into the binary search tree
* @return: The root of the new binary search tree.
*/
public TreeNode insertNode(TreeNode root, TreeNode node) {
if(root == null || node == null) return root == null ? node : root;
if(node.val > root.val && root.right == null) {
root.right = node;
}else if(node.val < root.val && root.left == null) {
root.left = node;
}
if(node.val > root.val) {
insertNode(root.right, node);
}
else if(node.val < root.val) {
insertNode(root.left, node);
}
return root;
}
}
方法二: DFS
在当前root左孩子中找到第一个比node小的节点。如果当前位置为空,则当前为插入位置。不为空,则插入位置在当前节点的右孩子上.
public class Solution {
/**
* @param root: The root of the binary search tree.
* @param node: insert this node into the binary search tree
* @return: The root of the new binary search tree.
*/
public TreeNode insertNode(TreeNode root, TreeNode node) {
if(root == null || node == null) return root == null ? node : root;
TreeNode temp = root;
TreeNode prev = null;
while(true) {
while(temp != null && temp.val > node.val) {
prev = temp;
temp = temp.left;
}
if(temp == null) {
prev.left = node;
return root;
}
if(temp.right == null) {
temp.right = node;
return root;
}
temp = temp.right;
}
}
}