算法思想:利用后序非递归遍历,借助栈来实现。假设p在q的左边。第一步,利用栈先遍历到p所指结点,这时栈中全是p的祖先,第二步,将栈中元素全部复制到另一个栈中,继续遍历,直到q结点出现,此时遍历结束。让栈1和栈2中元素进行比较匹配,第一个相等的即为最近公共祖先。
Typedef struct{
BiTree t;
int tag;//tag=0表示左子女已被访问,tag=1表示右子女已被访问
}stack;
Stack s[],s1[];//栈
BiTree Ancestor(BiTree ROOT,BiTree *p,BiTree *q){
top=0;bt=ROOT;
while(bt!=null||top>0){
while(bt!=null){
S[++top]=bt;
S[top].tag=0;
bt=bt->lchild;
}//沿左分支遍历
while(top!=0&& s[top].tag==1){//右子女已被访问,假定p在q的左侧
if(s.[top].t==p){
for(i=1;i<=top;i++)
S1[i]=s[i];
top1=top;
}//将栈内元素复制到栈s1中
if(s[top].t==q)//找到p结点
for(i=top;i>0;i—-){
for(j=top1;j>0;j—-)//将栈s和s1中元素进行匹配
if(s1[j].t==s[i].t)//找到相等结点
return s[i].t;//找到并返回值
}
top - -;//退栈
}
if(top!=0){
S[top]. tag=1;
bt=s[top].t->rchild;沿右分枝
}
}
return Null;//无公共祖先
}