代码随想录第二十二天

代码随想录第二十二天

    • Leetcode 235. 二叉搜索树的最近公共祖先
    • Leetcode 701. 二叉搜索树中的插入操作
    • Leetcode 450. 删除二叉搜索树中的节点

Leetcode 235. 二叉搜索树的最近公共祖先

题目链接: 二叉搜索树的最近公共祖先
自己的思路:乍一看和二叉树的最近公共祖先类似,使用那个题的代码确实可以写出来,但是没有利用到二叉搜索树的性质;我们可以找出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)

Leetcode 701. 二叉搜索树中的插入操作

题目链接: 二叉搜索树中的插入操作
自己的思路:没想到!!!

正确思路:这道题不要想复杂了,只需要把要插入的元素插入到叶子节点就可以,想通这点就可以了!!!递归三部曲: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)

Leetcode 450. 删除二叉搜索树中的节点

题目链接: 删除二叉搜索树中的节点
自己的思路:没想到!!!!

正确思路:本题并不是遍历整个二叉搜索树,而是遍历到符合条件的二叉搜索树结点然后进行返回,所以本题递归终止条件较为繁琐;递归三部曲: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)

你可能感兴趣的:(数据结构,java,开发语言,算法)