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