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); } } }

浙公网安备 33010602011771号