题目描述
给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据保证,新值和原始二叉搜索树中的任意节点值都不同。
注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回任意有效的结果。
解题思路
- 迭代法:迭代法是通过模拟二叉搜索树插入结点的过程进行操作的,利用二叉搜索树的性质,对于任何一个节点来说,左子树都比该节点的值小,右子树都比该节点的值大
- 递归法:根据节点值与插入节点值的关系,搜索左子树或右子树,直到到达外部节点,根据节点的值与目标节点的值的关系,将新节点添加为其左侧或右侧的子节点
迭代法
/**
* 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);
}
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;
}
}
- 时间复杂度:O(n)
递归法
/**
* 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(val < root.val){
root.left = insertIntoBST(root.left,val);
}else{
root.right = insertIntoBST(root.right,val);
}
return root;
}
}
- 时间复杂度:O(n)