236. Lowest Common Ancestor of a Binary Tree最低公共祖先

这题真的是一道经典题,有很多变种,如果不会写赶紧联系recruiter推迟面试吧 :)
基本假设:两个node A,B 都在树里。
如果root是其中一个点,那么就真不用往下找了。反正如果另一个点也在它下面,那他俩的LCA肯定是这个root。所以结论是如果你找到了一个点,就不要往下了,直接返回该点。但这时你不确定另外一个点到底是不是你孩子,你只能说可能是。
如果在一棵树里没有发现A或B,那么返回null。
如果某一node在它的左右子树里面分别返回了两个不为null的点, 则说明左边也找到一点啥,右边也找到一点啥,最低公共祖先肯定 是这个了。

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null) return null;
        if (root == p || root == q) return root;
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        if (left != null && right != null) return root;
        return left == null ? right : left;
    }

注意,ancestor的拼写不要写错了...
这个代码还挺漂亮吧.

这道题可以扩展的地方在于
如果有不止两个节点找公共祖先
如果树非常大怎么办
如果节点不一定在树里怎么办
如果给你parent指针你怎么优化

你可能感兴趣的:(236. Lowest Common Ancestor of a Binary Tree最低公共祖先)