1.后序遍历利用栈,遍历到当前结点时栈中的元素即为它的所有祖先
bool Postorder(BiTNode *p,int x){
SqStack S;
initSqStack(&S);
BiTNode *r=NULL;
while(p||!empty(S)){
if(p!=NULL){
if(p->data==x){
ancient_x(&S);
return true;
}
Push(&S,p);
p=p->lchild;
}
else{
p=GetTop(&S);
if(p->rchild&&p->rchild!=r){
p=p->rchild;
}
else{
p=Pop(&S);
r=p;
p=NULL;
}
}
}
printf("无祖先");
return false;
}
2.遍历到值为x时输出栈中的元素为祖先的相反顺序,再次利用一个栈解决这个问题
void ancient_x(SqStack *S){
SqStack S1;
initSqStack(&S1);
BiTNode *p=NULL;
while(S->top!=-1){
p=Pop(S);
Push(&S1,p);
}
while(S1.top!=-1){
p=Pop(&S1);
printf("%d ",p->data);
}
}
3.所有代码
#include <stdio.h>
#include <stdlib.h