设计并实现一个算法,找出二叉树中某两个节点的第一个共同祖先。不得将其他的节点存储在另外的数据结构中。注意:这不一定是二叉搜索树。
说明:
- 所有节点的值都是唯一的。
- p、q 为不同节点且均存在于给定的二叉树中。
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
List<TreeNode> pPath = new ArrayList<>();
List<TreeNode> qPath = new ArrayList<>();
pathFind(root,p,pPath);
pathFind(root,q,qPath);
int index = 0;
int len = Math.min(pPath.size(),qPath.size());
while(index<len){
if(pPath.get(index)==qPath.get(index)){
index++;
}else{
break;
}
}
return pPath.get(index-1);
}
public boolean pathFind(TreeNode root, TreeNode p, List<TreeNode> path){
path.add(root);
if(root==p){
return true;
}
if(root==null){
return false;
}
TreeNode[] childs = new TreeNode[]{root.left,root.right};
for(TreeNode child: childs){
if(pathFind(child,p,path)){
return true;
}else{
path.remove(path.size()-1);
}
}
return false;
}
}