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>
#include <stdbool.h>
#define MaxSize 10
typedef struct BiTNode{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef struct{
BiTNode *data[MaxSize];
int top;
}SqStack;
void initSqStack(SqStack *S){
S->top=-1;
}
bool empty(SqStack S){
if(S.top==-1){
return true;
}
else{
return false;
}
}
bool Push(SqStack *S,BiTNode *p){
if(S->top==MaxSize-1) return false;
S->data[++S->top]=p;
return true;
}
int Pop(SqStack *S){
if(S->top==-1) return false;
return S->data[S->top--];
}
int GetTop(SqStack *S){
if(S->top==-1) return false;
return S->data[S->top];
}
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);
}
}
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;
}
int main() {
BiTree T;
BiTNode *p=(BiTree)malloc(sizeof(BiTNode));
p->data=1;
p->lchild=NULL;
p->rchild=NULL;
BiTNode *m=(BiTree)malloc(sizeof(BiTNode));
m->data=2;
m->lchild=NULL;
m->rchild=NULL;
p->lchild=m;
BiTNode *n=(BiTree)malloc(sizeof(BiTNode));
n->data=4;
n->lchild=NULL;
n->rchild=NULL;
m->rchild=n;
BiTNode *q=(BiTree)malloc(sizeof(BiTNode));
q->data=6;
q->lchild=NULL;
q->rchild=NULL;
n->lchild=q;
BiTNode *a=(BiTree)malloc(sizeof(BiTNode));
a->data=3;
a->lchild=NULL;
a->rchild=NULL;
p->rchild=a;
BiTNode *b=(BiTree)malloc(sizeof(BiTNode));
b->data=5;
b->lchild=NULL;
b->rchild=NULL;
a->rchild=b;
Postorder(p,7);
return 0;
}
4.当前代码的二叉树(当前查找结点7无祖先,输出无祖先)