1.链式存储
思路:用栈保存每个结点的祖先结点,如果结点的值为item,打印结果。
代码思路:
void ANCESTOR(BTREE T,int item)
{
BTREE STACK1[NodeNum],p = T;
int STACK2[NodeNum],top=-1,flag;
if(T!=NULL && T->data!=item)
{
//do
while(p || top != -1)
{
//将左子树入栈STACK1
//左子树标志为0,右子树标志为1
//标志位入栈STACK2
while(p!=NULL)
{
STACK1[++top] = p;
STACK2[top] = 0;
p=p->lchild;
}
p=STACK1[top];
flag=STACK2[top--];
//是左孩子时,将自己和右孩子入栈
if(flag==0)
{
STACK1[++top] = p;
STACK2[top] = 1;
p=p->rchild;
}
//已经访问过
else
{
if(p->data == item)
{
while(top != -1)
{
printf("%4d",STACk1[top--]->data);
}
break;
}
else
p=NULL;
}
}
}
}
void AncestorX(BiTNode* T,ElemType x)
{
SqStack S;
InitStack(&S);
BiTNode* p=T;
BiTNode* r=NULL;
while(p||IsEmptyStack(&S))
{
if(p!=NULL)
{
Push(&S,p);
p=p->lchild;
}
else
{
p=GetTop(&S);
if(p->rchild!=NULL&&p->rchild!=r)
{
p=p->rchild;
Push(&S,p);
p=p->lchild;
}
else
{
p=Pop(&S);
if(p->data==x)
{
while(IsEmptyStack(&S)!=0)
{
p=Pop(&S);
printf("%c",p->data);
}
}
r=p;
p=NULL;
}
}
}
}
2.顺序存储
思路:
1.找到item在位置i;
2.打印i/2的结点;
3.如果i!=0,执行2;
4.最后打印根节点。
参考:https://blog.csdn.net/u013595419/article/details/52159821