给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
如果从最近公共祖先找两个指定节点:这两个指定节点一定不在同一个子树中。
这道题有点神奇,要找最近公共祖先,我们从树的根节点往下操作
我们设一个辅助方法(Boolean)帮我们找指定节点,如果找到了,返回1
逼近条件:
- root为空时,不会包含任何节点,返回null
- 深陷递归,如果当前节点为指定节点,说明找到了(否则遍历左子树,右子树)
if(root == null){
return false;
}
int mid = (root == p || root == q) ? 1 : 0;
接着创建两个int变量存储左右子树找到指定节点的个数,
递归过去,返回到一个层,如果此时mid+left+right = 2 说明左子树找到一个右子树找到一个,这个层就是公共祖先
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
TreeNode lca = null;
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null){
return null;
}
findNode(root,p,q);
return lca;
}
public boolean findNode(TreeNode root, TreeNode p, TreeNode q){
if(root == null){
return false;
}
int mid = (root == p || root == q) ? 1 : 0;
int left = findNode(root.left,p,q) ? 1 : 0;
int right = findNode(root.right,p,q) ? 1 : 0;
if(mid + left + right >= 2){
lca = root;
}
return (mid + left + right)> 0;
}
}
找到两个也返回1是因为大祖宗也是公共祖先呀,但是他并不是最近的。大祖宗左子树找到两个返回1,右子树肯定找不到。所有mid+left+right = 1不是最近的祖宗。