void PostOrder_2(Bitree *T)
{
TreeStc *st=NULL;
CreatStack(&st); //空栈;
Bitree *t=T; //遍历二叉树的指针;
Bitree *p=NULL; //指向上一个出栈并打印的节点的指针;
int flag=1;
do{
while(t!=NULL)
{
PushStack(st,*t);
t=t->lch;
}
flag=1;
while((!IsEmpty(st))&&flag==1)
{
t=(Bitree *)malloc(sizeof(Bitree));
GetTopStack(st,t); //取得栈顶元素;
Bitree *r=t->rch;
if(r==NULL||r->data==p->data) //point
{
printf("%c\t",t->data);
t=(Bitree *)malloc(sizeof(Bitree));
PopStack(st,t);
p=t;
}
else
{
t=t->rch;
flag=0;
}
}
}while(!IsEmpty(st));
free(t);
DestoryStack(st);
return;
}
值得注意的是,在李春葆《数据结构教程》第五版的224页,书上在本页代码的point处的if语句写为:
if(t->rch==p)
但是这样做会导致程序陷入无限循环,因为此处不是要比较t->rch和p所存地址是否一样,而是想判断p指针所指内容是否是r指针的右孩子,在不考虑二叉树有重复元素的情况下,直接取其节点保存的值作为判断条件即可:
Bitree *r=t->rch;
if(r==NULL||r->data==p->data)
处理有关指针的问题时,一定要注意一般指针本身不会作为判断的条件。