二叉树的几种非递归建立与遍历的实现

  1. #include<iostream>
  2. #include<stdlib.h>
  3. #include<stack>
  4. #include<queue>
  5. #include<string>
  6. using namespace std;
  7. #define OK 1
  8. #define ERROR 0
  9. #define OVERFLOW -2
  10. typedef int Status;
  11. typedef char ElemType;
  12. typedef Status (*Visit)(ElemType e);
  13. typedef struct  BiTNode
  14. {
  15.         ElemType data;
  16.         struct BiTNode *lchild,*rchild;
  17.         }BiTNode,*BiTree;
  18. /*
  19. Status CreateBiTree(BiTree &T,string s)  // 非递归按层次从左到右创建 
  20. {
  21.      queue<BiTree> q;
  22.      BiTree p,m;
  23.      if(s[0]=='#') T=NULL;
  24.      else {
  25.            T=new BiTNode;
  26.            T->data=s[0];
  27.            q.push(T); }
  28.      int i=1;
  29.      while(!q.empty())
  30.       {
  31.          p=q.front();
  32.          q.pop();
  33.          if(s[i]!='#') {
  34.                         m=new BiTNode;
  35.                         m->data=s[i++];
  36.                         p->lchild=m;
  37.                         q.push(m);
  38.                         if(s[i]!='#') {
  39.                                       m=new BiTNode;
  40.                                       m->data=s[i++];
  41.                                       p->rchild=m;
  42.                                       q.push(m);}
  43.                         else p->rchild=NULL;}
  44.          else {
  45.               p->lchild=NULL;
  46.               if(s[i]=='#') 
  47.      {p->rchild=NULL;i++;} }
  48.          }
  49.          return OK; }
  50. */
  51. Status CreateBiTree(BiTree &T,string str)   //非递归先序创建 
  52. {
  53.     int flag,k=0;
  54.  size_t i=0;
  55.     stack<BiTree> s;
  56.     BiTree p,cur;
  57.    if(str[0]=='#') {T=NULL;return OK;} 
  58.    while(i<str.size())
  59.    {
  60.     if(str[i]!='#') {
  61.          p=new BiTNode;
  62.          p->data=str[i];
  63.          s.push(p);
  64.          flag=k?3:0;}
  65.     else {flag++; i++;p=NULL;}    
  66.     if(!i) {cur=T=p;i++;}
  67.     else 
  68.     switch(flag)
  69.  {case 0:
  70.              cur->lchild=p;
  71.              cur=p;i++;
  72.              break;
  73.     case 1: 
  74.             cur->lchild=p;
  75.             break;
  76.     case 2:
  77.             cur->rchild=p;s.pop();
  78.             if(i<str.size()) {
  79.                              cur=s.top();
  80.                              s.pop();}
  81.             k=1;
  82.             break;
  83.    case 3: 
  84.            cur->rchild=p;
  85.            cur=p;
  86.            k=0;
  87.            i++;
  88.            flag=0;
  89.            break;};
  90.     }return OK;
  91. }
  92. Status PrintElem(ElemType e)
  93. {
  94.    cout<<e;
  95.    return OK; }
  96. void PreOrderTraverse(BiTree T,Status(*Visit)(ElemType e)) {
  97. //非递归先序遍历 
  98. if(!T) return;
  99. stack<BiTree> s;
  100. BiTree p=T;
  101. while(p||!s.empty())
  102. {
  103.    while(p)
  104.        {
  105.          Visit(p->data);
  106.          s.push(p);
  107.          p=p->lchild;  }
  108.    p=s.top()->rchild;
  109.    s.pop();
  110.    }
  111.  cout<<endl;}  
  112. void InOrderTraverse(BiTree T,Status(*Visit)(ElemType e)) {
  113. //非递归中序遍历 
  114. stack<BiTree> m;
  115. BiTree p=T;
  116. while(p||!m.empty())   
  117.  if(p) {m.push(p);p=p->lchild;}
  118.  else {
  119.   p=m.top();
  120.   m.pop();
  121.   Visit(p->data);
  122.   p=p->rchild; } 
  123. cout<<endl;}
  124. void PostOrderTraverse(BiTree T,Status(*Visit)(ElemType e)) {
  125. //非递归后序遍历
  126. if(!T) return;
  127. stack<BiTree> s;
  128. BiTree p=T,pre=NULL;
  129. while(p||!s.empty()){
  130.    while(p)
  131.        {
  132.          s.push(p);
  133.          p=p->lchild;  }
  134.    p=s.top();
  135.    if(!p->rchild||p->rchild==pre){
  136.           Visit(s.top()->data);
  137.           s.pop();
  138.           pre=p;
  139.           p=NULL;}     
  140.    else  p=p->rchild;
  141.    }
  142. cout<<endl;}
  143. Visit Vis=PrintElem;
  144. int main()
  145. {
  146.    BiTree T;
  147.    string s;
  148.    cin>>s;
  149.    CreateBiTree(T,s);
  150.    PreOrderTraverse(T,Vis);
  151.    InOrderTraverse(T,Vis);
  152.    PostOrderTraverse(T,Vis);
  153.    return 0; }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值