//包含自身也算祖先
//有三种情况: 1.一个结点在左子树,另一个结点在右子树(公共祖先是root)
//2.两个结点都在左子树或者都在右子树
//3.其中有个结点是root(公共祖先则是root)
//因为题中已经说明有树,所以不考虑root为null情况
public TreeNode lowestcommomAncestor(TreeNode root, TreeNode p, TreeNode q){
if(root == p || root == q){ //其中有个结点是root,则公共祖先是root
return root;
}
boolean pInLeft = search(root.left, p);//判断p和传进去的某个结点的引用是否相等,不是和具体的值相等
boolean qInLeft = search(root.left, q);
if(pInLeft && qInLeft){ //两个结点都在左子树
return lowestcommomAncestor(root.left,p,q);
}
if(!pInLeft && !qInLeft){ //两个结点都在右子树
return lowestcommomAncestor(root.right,p,q);
}
return root; //一个结点在左子树,一个结点在右子树,公共祖先是root
}
public boolean search(TreeNode root, TreeNode n){ //等于就是n和root是同一个结点
if(root == null){
return false;
}
if(root == n){
return true;
}
if(search(root.left, n)){
return true;
}
return search(root.right, n);
}