从根节点往左右子树遍历过程中,对于一个最近共同祖先的情况如下(两结点存在的情况下):
1、当前结点就是两结点之一,另一个在当前结点的子树上。
2、一个在左、一个在右。
可以考虑递归:
//res存放结果
bool findanc(BitTree bt,BitTree p, BitTree q, BitTree &res) {
if(bt){
if( bt == p && (findanc(bt->lchild) || findanc(bt->rchild)) ) { //情况1
res = bt;
return true;
}
if( bt == q && (findanc(bt->lchild) || findanc(bt->rchild)) ) { //情况3
res = bt;
return true;
}
else if(bt == q || bt == p) return true; //当前是其一,但左右没有另一个
if (findanc(bt->lchild) && findanc(bt->rchild)) { //左子树有一个,右子树有一个 ,情况2
res = bt;
return true;
}
return (findanc(bt->lchild) || findanc(bt->rchild); //左子树或右子树有,这棵树就有。
}
}