设一棵二叉树的结点结构为(LLINK,INFO,RLINK)ROOT为指向该二叉树根结点的指针,p和q分别为指向该二叉树中任意两个结点的指针,编写一个算法ANCESTOR(ROOT,p,q,r),找到p和q的最近公共祖先结点.
思路:
采用非递归后续遍历算法,因为在访问一个结点p时,栈中结点恰好是p结点的所有祖先,从栈底到栈顶结点再加上p结点,刚好构成从根结点到p结点的一条路径.
栈内数据:
伪代码:
BiTree Ancestor(BiTree ROOT,BiTNode *p,BiTNode *q){
InitStack(S);
InitStack(S1);//辅助栈
BiTree *temp;
r = NULL;
while(temp||!IsEmpty(S)){
if(temp){
Push(S,temp);
temp = temp->lchild;
}else{
GetTop(S,temp);
if(temp->rchild&&temp->rchild!=r){
Push(S,temp);
temp = temp->lchild;
}else{
Pop(S,temp);
if(temp==p){
//将栈s的数据复制到s1里面一份,现在数据是根结点到p的所以祖先
}
if(temp==q){//说明遍历到q
//栈s和栈s1的数据一一匹配,找到第一个匹配的结点将其返回
return ;
}
r = p;
p = NULL;
}
}
}
return NULL;//p和q无公共祖先
}