题目链接: 二叉搜索树的最近公共祖先
自己的思路:乍一看和二叉树的最近公共祖先类似,使用那个题的代码确实可以写出来,但是没有利用到二叉搜索树的性质;我们可以找出p和q结点值的较大者和较小者,遍历整个二叉树,如果出现了某个结点值位于两者之间,就是我们要找的结点;递归三部曲:1、终止条件:如果找到了位于两者之间的结点值,直接返回结点即可;2、传入参数:当前结点,p和q结点和最大值和最小值;3、单层逻辑:如果当前结点值大于最大值,向左递归,如果小于则向右递归,否则返回当前节点!!!
正确思路:递归!
代码:
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
int max = p.val>q.val?p.val:q.val;
int min = p.val<q.val?p.val:q.val;
return lowestCommonAncestor_new(root,p,q,max,min);
}
public TreeNode lowestCommonAncestor_new(TreeNode root,TreeNode p,TreeNode q,int max,int min){
if (root.val>min&&root.val<max) return root;
else if (root.val>max) return lowestCommonAncestor_new(root.left,p,q,max,min);
else if (root.val<min) return lowestCommonAncestor_new(root.right,p,q,max,min);
return root;
}
}
复杂度分析:
时间复杂度: O ( n ) \mathcal{O}(n) O(n)
空间复杂度: O ( 1 ) \mathcal{O}(1) O(1)
题目链接: 二叉搜索树中的插入操作
自己的思路:没想到!!!
正确思路:这道题不要想复杂了,只需要把要插入的元素插入到叶子节点就可以,想通这点就可以了!!!递归三部曲:1、传入参数和返回值:当前节点、插入的节点值;返回插入之后的树的根节点;2、终止条件:当当前节点为空的时候,返回新建的节点,返回到上一个节点的左或者右节点,具体看下面;3、单层逻辑:当当前节点的值大于val的话,说明要插到左子树里面,返回值为root.left,因为是插到root的左子树里,否则插到右子树里,然后返回当前结点!!!!
代码:
class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {
//插入到叶子节点上
if (root==null) return new TreeNode(val);
//当前节点的值大于val,就插到左子树上
if (root.val>val){
root.left = insertIntoBST(root.left,val);
}
if (root.val<val){
root.right = insertIntoBST(root.right,val);
}
return root;
}
}
复杂度分析:
时间复杂度: O ( n ) \mathcal{O}(n) O(n)
空间复杂度: O ( 1 ) \mathcal{O}(1) O(1)
题目链接: 删除二叉搜索树中的节点
自己的思路:没想到!!!!
正确思路:本题并不是遍历整个二叉搜索树,而是遍历到符合条件的二叉搜索树结点然后进行返回,所以本题递归终止条件较为繁琐;递归三部曲:1、传入参数和返回值:当前结点和key值;返回参数为删除之后的树的根节点;2、终止条件:当当前节点为空的时候,直接返回空,当当前结点的值等于key的时候,要分情况处理, ( 1 ) (1) (1):当当前节点为叶子节点时,直接返回空; ( 2 ) (2) (2):当当前节点左节点为空时,返回右节点; ( 3 ) (3) (3):当当前节点右节点为空时,返回左节点; ( 4 ) (4) (4):当左节点不为空,右节点也不为空时,要进行树的变换,我们以删除以后右节点上位为例,那么删除以后的左节点会放到右子树的最左边的非空节点下面即可;3、单层逻辑:左右递归,和二叉搜索树的插入类似!!!!
代码:
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
//终止条件
if (root==null) return root;
if (root.val==key){
if (root.left==null&&root.right==null) return null;
else if (root.right==null) return root.left;
else if (root.left==null) return root.right;
else{
TreeNode node = root.right;
while(node.left!=null){
node = node.left;
}
node.left = root.left;
return root.right;
}
}
//左右递归
if (root.val>key) root.left = deleteNode(root.left,key);
if (root.val<key) root.right = deleteNode(root.right,key);
return root;
}
}
复杂度分析:
时间复杂度: O ( n ) \mathcal{O}(n) O(n)
空间复杂度: O ( 1 ) \mathcal{O}(1) O(1)