二叉树的非递归中序遍历(二叉线索存储结构)

举报
悦来客栈的老板 发表于 2020/12/30 01:34:56 2020/12/30
【摘要】   # include <stdio.h># include <malloc.h># include <stdlib.h># include <iostream.h> # define OK 1# define ERROR 0# define OVERFLOW -1 typedef char TElem...


       # include <stdio.h>
       # include <malloc.h>
       # include <stdlib.h>
       # include <iostream.h>
       # define OK 1
       # define ERROR 0
       # define OVERFLOW -1
       typedef char TElemType;
       typedef enum PointerTag { Link, Thread };
       typedef struct BiThrNode
       {
        TElemType data;
       struct BiThrNode *lchild, *rchild;
        PointerTag  LTag, RTag;
       }BiThrNode,*BiThrTree;
       BiThrTree pre;
       void InThreading(BiThrTree p)
       {
       if (p)
        {
         InThreading(p->lchild);
        if (!p->lchild)
         {
          p->LTag = Thread;
          p->lchild = pre;
         }
        if (! pre->rchild)
         {
          pre->RTag = Thread;
          pre->rchild = p;
         }
         pre = p;
         InThreading(p->rchild);
        }
       }
       int InOrderThreading(BiThrTree &Thrt, BiThrTree T)
       {
        Thrt = (BiThrTree) malloc (sizeof (BiThrNode));
       if (!Thrt)
        exit (OVERFLOW);
        Thrt->LTag = Link;
        Thrt->RTag = Thread;
        Thrt->rchild = Thrt;
       if (!T)
         Thrt->lchild = Thrt;
       else
        {
         Thrt->lchild = T;
         pre = Thrt;
         InThreading(T);
         pre->rchild = Thrt;
         pre->RTag = Thread;
         Thrt->rchild = pre;
        }
       return OK;
       }
       int CreateBiThrTree(BiThrTree &T)
       {
        TElemType ch;
       cin>>ch;
       if (ch == '#')
         T = NULL;
       else
        {
         T= (BiThrTree) malloc (sizeof (BiThrNode));
         T->data = ch;
         CreateBiThrTree(T->lchild);
        if (T->lchild)
          T->LTag = Link;
         CreateBiThrTree(T->rchild);
        if (T->rchild)
          T->RTag = Link;
        }
       return OK;
       }
       int InOrderTraverse_Thr(BiThrTree T,int (*Visit)(TElemType e))
       {
        BiThrTree p;
        p = T->lchild ;
       while (p != T)
        {
        while (p->LTag == Link)
          p = p->lchild ;
        if (! Visit(p->data))
         return ERROR;
        while (p->RTag == Thread && p->rchild != T)
         {
          p = p->rchild ;
          Visit(p->data);
         }
         p = p->rchild ;
        }
       return OK;
       }
       int Print(TElemType e)
       {
       cout<<e;
       return OK;
       }
       int main(void)
       {
        BiThrTree T,H;
       cout<<"请按先序建立一棵二叉树,#代表空树!"<<endl;
        CreateBiThrTree(T);
        InOrderThreading(H,T);
       cout<<"它的中序遍历是:";
        InOrderTraverse_Thr(H,Print);
       cout<<endl;
       return 0;
       }
   

结果图:

文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq523176585/article/details/6772400

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。