- 借助一个辅助函数, 在 root 中递归查找 p 和 q.
设定辅助函数的返回值, 如果找到返回 1(找到一个或者两个都算), 没找到 返回 0 - 这个递归查找的过程进一步拆解开. 递归在左子树中查找 + 递归在右子树中查找 + 对比根节点
- 如果这三个位置中, 有两个地方找到了, 这个当前节点就是要找的最近公共祖先
private TreeNode lca = null;
public TreeNode lowestCommonAncestor(TreeNode root,TreeNode p,TreeNode q){
if(root == null){
return null;
}
findNode(root,p,q);
return lca;
}
private boolean findNode(TreeNode root,TreeNode p,TreeNode q){
if(root == null){
return false;
}
int left = findNode(root.left,p,q)?1:0;
int right = findNode(root.right,p,q)?1:0;
int mid = (root == p || root == q)?1:0;
if(left + right + mid >= 2){
lca = root;
}
return (left + right + mid)>0;
}