CC150 : Lowest Common Ancestor

经典题,黄亮讲过。java版就会难看一点,要写个wrapper class,把结果放在一起。 这里要return三个变量,如果只返回两个变量(node 和 isAncestor),实现起来的逻辑会复杂一些。

 

class Solution {
    class Result{
        TreeNode node;
        boolean hasP;
        boolean hasQ;
        public Result(TreeNode node, boolean hasP, boolean hasQ) {
            this.node = node;
            this.hasP = hasP;
            this.hasQ = hasQ;
        }
    }
    
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q){
        Result result = lca(root, p, q);
        return result.node;
    }

    private Result lca(TreeNode root, TreeNode p, TreeNode q) {
        if(root = null) return new Result(null, false, false);
        Result left = lca(root.left, p, q);
        if(left.hasP && left.hasQ) return left;
        Result right = lca(root.right, p, q);
        if(right.hasP && right.hasQ) return right;
        boolean hasP = root == p || left.hasP || right.hasQ;
        boolean hasQ = root == q || left.hasQ || right.hasQ;
        if(hasP && hasQ) return new Result(root, true, true);
        return new Result(null, hasP, hasQ);
    }
}

 

 

返回两个变量的版本: 
class Solution {
    class Result{
        TreeNode node;
        boolean isAncestor;
        public Result(TreeNode node, boolean isAncestor) {
            this.node = node;
            this.isAncestor = isAncestor;
        }
    }
    
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q){
        Result result = lca(root, p, q);
        return result.isAncestor ? result.node : null;
    }

    private Result lca(TreeNode root, TreeNode p, TreeNode q) {
        if(root = null) return new Result(null, false);
        if(root == p && root == q) return new Result(root, true);
        Result left = lca(root.left, p, q);
        if(left.isAncestor) return left;
        Result right = lca(root.right, p, q);
        if(right.isAncestor) return right;
        if(left.node != null && right.node != null) {
            return new Result(root, true);
        } else if(root == p || root == q) {
            boolean isAncestor = (left.node != null || right.node != null) ? true : false;
            return new Result(root, isAncestor); 
        } else {
            return new Result(left.node != null ? left.node : right.node, false);
        }
    }
}

 

posted @ 2015-02-26 12:47  江南第一少  阅读(190)  评论(0)    收藏  举报