二叉树的非递归遍历算法

void  preOrderNoRe(BiTree T)           // 前序遍历
 54   {
 55      Stack  * st;
 56      initstack(st);
 57      BiTree p;
 58      p = T;
 59         while  (p != NULL ||! isempty(st))
 60        {
 61               while  (p != NULL)
 62              {
 63                    cout << p -> data << "    " ;
 64                    push(st,p);
 65                    p = p -> lchild;
 66              }
 67               if  ( ! isempty(st))
 68              {
 69                          p = pop(st);
 70                          p = p -> rchild;
 71              }
 72              
 73        }
 74   }
 75   void  inOrderNoRe(BiTree T)        //中序遍历
 76   {
 77      Stack  * st;
 78      initstack(st);
 79      BiTree p;
 80      p = T;
 81         while  (p != NULL ||! isempty(st))
 82        {
 83               while  (p != NULL)
 84              {
 85                    push(st,p);
 86                    p = p -> lchild;
 87              }
 88               if  ( ! isempty(st))
 89              {
 90                          p = pop(st);
 91                          cout << p -> data << "    " ;
 92                          p = p -> rchild;
 93              }
 94              
 95        }
 96   }
 97  
  1. void PostOrder_Nonrecursive1(BiTree T)  // 后序遍历的非递归      
  2. {      
  3.     stack<BiTree> S;      
  4.     BiTree curr = T ;           // 指向当前要检查的节点    
  5.     BiTree previsited = NULL;    // 指向前一个被访问的节点    
  6.     while(curr != NULL || !S.empty())  // 栈空时结束      
  7.     {      
  8.         while(curr != NULL)            // 一直向左走直到为空    
  9.         {      
  10.             S.push(curr);      
  11.             curr = curr->lchild;      
  12.         }      
  13.         curr = S.top();    
  14.         // 当前节点的右孩子如果为空或者已经被访问,则访问当前节点    
  15.         if(curr->rchild == NULL || curr->rchild == previsited)      
  16.         {      
  17.             cout<<curr->data<<"  ";      
  18.             previsited = curr;      
  19.             S.pop();      
  20.             curr = NULL;      
  21.         }      
  22.         else    
  23.             curr = curr->rchild;      // 否则访问右孩子    
  24.     }      
  25. }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值