二叉树后序非递归遍历

本文讨论了二叉树后序遍历过程中可能出现的一个问题,特别指出在李春葆《数据结构教程》第五版中关于后序遍历的代码存在一处可能导致无限循环的错误。问题在于书中代码的if语句条件设置不当,应根据节点值而非指针地址进行判断,以确保正确识别二叉树的右孩子,避免在处理含有重复元素的二叉树时出现错误。
摘要由CSDN通过智能技术生成
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)

处理有关指针的问题时,一定要注意一般指针本身不会作为判断的条件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值