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

理解题意:

        二叉搜索树的最近公共祖先:

        最近公共祖先:两个目标值的点不断向上返回,第一次汇合的节点为最近公共祖先。

        二叉搜索树:中间节点大于左子树所有节点,小于右子树所有节点,中序遍历时是严格的单调增序列。(树中没有重复数据)

        所以,可以借助目标值与节点的比较判断,两个值的公共最近公共祖先节点。

        两个值的最小公共祖先,一定有一下规律:

        最小公共祖先满足,其值介于两个目标值之间

两种情况:

        两个目标值位于某节点左右字数上。

        两个目标值互为父子关系。

        则加入,两个目标值有p

        遇到满足该条件的节点返回即可。

1.递归

由于二叉搜索树是有顺序的,利用其值顺序可以提前进行剪枝,其实会比单纯的二叉树更简单一些。

   public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        //由于题意限制,root一定不为空
        if(root.val>p.val&&root.val>q.val){
            //向左找
            if(root.left!=null) return lowestCommonAncestor(root.left,p,q);
        }else if(root.val

2.迭代

由于顺序的关系,总是有选择的向一个方向遍历,所以,对于迭代的方法来说,解决该题也比较简单且容易理解。

对于二叉搜索树的有序的特点,根据节点值判断,只需要按照一条路找下去即可,不需要回溯,不需要栈来维护。

public TreeNode lowestCommonAncestor2(TreeNode root, TreeNode p, TreeNode q) {
        //只需要按照一条路找下去即可,不需要回溯,不需要栈来维护
        while(root!=null){
            if(root.val>p.val&&root.val>q.val){
                //向左找
                root=root.left;
            } else if (root.val

3.分析

时间复杂度:

        递归:O(log2N)

        迭代:O(log2N)

空间复杂度:

        递归:O(n)

        迭代:O(n)

        

你可能感兴趣的:(刷题训练营,算法,leetcode,数据结构)