剑指 Offer 68

思路:

 由于是二叉搜索树,很快想到了如果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;
    }
}

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

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