二刷236. Lowest Common Ancestor of a Binary Tree

Medium
刷面经,这个题居然又不会做了,这个讲解很不错帮助到我理解.
https://www.youtube.com/watch?v=WqNULaUhPCc
分治法经典运用,注意到我们调用这个递归函数返回的情况只有两种可能base case:

  • 返回null,什么也没找到
  • 返回p或者q, 找到了

那么如果我们分别在左右子树都返回了非空的TreeNode,说明我们两边都在base case return了一个非空的treenode, 即我们的p or q.说明两个node分别在左右子树,这样的话LCA就是root

如果我们有一边返回了非空node,另一边返回了空,说明我们在返回空的那一边一无所获什么也没找到,那么我们就return left.为什么这里可以直接return left呢,因为按照我们的函数,只要遇到能return的非空node,一定是先发现的那个,也就是另一个p或者q肯定是它的子树,所有他俩的LCA肯定就是它了。

public class Solution {
    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;
        }
        if (left != null){
            return left;
        }
        if (right != null){
            return right;
        }
        return null;
    }
}

你可能感兴趣的:(二刷236. Lowest Common Ancestor of a Binary Tree)