二叉树的四种的非递归遍历算法

  1 #include <iostream>
  2 #include <stack>
  3 #include <queue>
  4 using namespace std;
  5 typedef struct BinTree
  6 {
  7     int data;
  8     BinTree *lc;
  9     BinTree *rc;
 10 }BTNode,*BinTree;
 11 
 12 //中序遍历的非递归算法
 13 void InOrder(BinTree T)
 14 {
 15     stack<BinTree> s;
 16     BinTree P = T;
 17     while(p||!s.empty())//只要有一个满足即可,此时p不为空
 18     {
 19         if(p)
 20         {
 21             s.push(p);
 22             p = p->lc;
 23         }
 24         else
 25         {
 26             p = s.top();//访问栈顶
 27             s.pop();
 28             cout<<p->data<<endl;//访问
 29             p = p->rc;
 30         }
 31     }
 32 
 33 }
 34 
 35 //先序遍历的非递归算法
 36 void PreOrder(BinTree T)
 37 {
 38     stack<BinTree> s;
 39     BinTree p = T;
 40     while(p||!s.empty())
 41     {
 42         if(p)
 43         {
 44             cout<<p->data<<endl;//访问
 45             s.push(p);
 46             p = p->lc;
 47         }else
 48         {
 49             p = s.top();//访问栈顶
 50             s.pop();
 51             p = p->rc;
 52         }
 53     }
 54 }
 55 
 56 
 57 //后序遍历的非递归算法
 58 void PostOrder(BinTree T)
 59 {
 60     stack<BinTree> s;
 61     BinTree p = T,r = NULL;
 62     while(p||!s.empty())
 63     {
 64         if(p)
 65         {    //从根节点向左边走
 66             s.push(p);
 67             p = p->lc;
 68         }
 69         else
 70         {    //左边走不通向右走
 71             p = s.top();
 72             if(p->rc&&p->rc!=r)//如果右子树存在,且未被访问过
 73             {
 74                 p = p->rc;
 75                 s.push(p);
 76                 p = p->lc;
 77             }else
 78             {
 79                 p=s.top();
 80                 s.pop();
 81                 cout<<p->data<<endl;
 82                 r=p;            //记录最近访问的节点
 83                 p=NULL;            //节点访问完之后,重置p指针,目的是为了防止再次将左孩子压栈
 84             }
 85         }
 86     }
 87 }
 88 
 89 //层次遍历的非递归算法
 90 
 91 void LevelOrder(BinTree T)
 92 {
 93     if(T==NULL)
 94         return;
 95     queue<BinTree> q;
 96     q.push(T);                //根节点压栈
 97     BinTree p;
 98     while(!q.empty())
 99     {
100         p = q.front();        //获取队头
101         q.pop();
102         cout<<p->data<<endl;//访问
103         if(p->lc)
104             q.push(p->lc);
105         if(p->rc)
106             q.push(p->rc);
107         
108     }
109 }

 

posted @ 2015-10-07 22:58  HOU_JUN  阅读(607)  评论(0编辑  收藏  举报