首页 > 其他 > 详细

剑指 Offer 68 - I. 二叉搜索树的最近公共祖先

时间:2021-02-05 19:17:01      阅读:21      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 

思路:

技术分享图片

 

 由于是二叉搜索树,很快想到了如果root大小位于p,q之间,则root为结果,否则pq位于同侧

然后自然想到了递归

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if((((p.val>=root.val)&&(root.val>=q.val)))||(((q.val>=root.val)&&(root.val>=p.val))))//pq位于两侧,直接返回root节点 等于情况
        {
            return root;
        }

        if(p.val>root.val)
        {return lowestCommonAncestor(root.right,p,q);}
        if(p.val<root.val)
        {return lowestCommonAncestor(root.left,p,q);}

        return root;

    }
}

但这个写得太复杂了,标准的这么写就行:

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root.val < p.val && root.val < q.val)
            return lowestCommonAncestor(root.right, p, q);
        if(root.val > p.val && root.val > q.val)
            return lowestCommonAncestor(root.left, p, q);
        return root;
    }
}

 

 

接着看到解答,其实还有一种迭代的解法。递归的解法空间复杂度为On,迭代就不需要。

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        while(root != null) {
            if(root.val < p.val && root.val < q.val) // p,q 都在 root 的右子树中
                root = root.right; // 遍历至右子节点
            else if(root.val > p.val && root.val > q.val) // p,q 都在 root 的左子树中
                root = root.left; // 遍历至左子节点
            else break;
        }
        return root;
    }
}

 

以后在分析复杂度上还是要好好看一看

 

剑指 Offer 68 - I. 二叉搜索树的最近公共祖先

原文:https://www.cnblogs.com/take-it-easy/p/14379201.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!