解题思路:
二叉搜索树特点:中间节点大于所有左子树值,小于所有右子树值。中序遍历是严格单调增序列。
再次明确:二叉搜索树,没有重复节点,所以新插入的值也不可能和树里元素重复。
原因:题目限制
插入的值,总能在叶子上找到一个合适的值插入,其不会改变原有节点的位置。
这就导致这道题不会太难,即找到一个合适的叶子,将新值变成它的左或右孩子。
解题方法:
递归 迭代
1.递归
由于二叉搜索树的有序性,找到一个合适的叶子总是容易的,可以根据值的大小关系选择向左还是向右。
public TreeNode insertIntoBST(TreeNode root, int val) {//找到合适的位置if(root==null) return new TreeNode(val);//val往root的左子树找if(root.val>val){root.left=insertIntoBST(root.left,val);//将更新后的左子树重新赋值} else if (root.val<val) {//val往root的右子树找root.right=insertIntoBST(root.right,val);//将更新后的右子树重新赋值}return root;}
2.迭代
注意当root为null是,也是有返回值的——new TreeNode(val)
该题也相当于是二叉搜索树种的查找操作,不需要回溯,不需要栈来模拟递归过程。
所以则道题目用迭代也非常简单且易于理解。
public TreeNode insertIntoBST2(TreeNode root, int val) {TreeNode cur=root;while(cur!=null){//向左插入if(cur.val>val){if(cur.left!=null){cur=cur.left;}else{//插入cur.left=new TreeNode(val);break;}//向右插入} else if (cur.val<val) {if(cur.right!=null){cur=cur.right;}else{//插入cur.right=new TreeNode(val);break;}}}return root==null?new TreeNode(val):root;}
3.分析
时间复杂度:
递归:O(n)
迭代:O(n)
空间复杂度:
递归:O(log2N)
迭代:O(log2N)