二叉树的六种遍历方式

一、递归实现前序、中序以及后序遍历

1 void printTree(node *T)
2 {
3     if(T)
4     {
5         printTree(T->left);
6         cout<<T->val;//调整输出节点T的顺序,可分别实现前序,后序
7         printTree(T->right);
8     }
9 }

二、循环实现前序、中序以及后序遍历

思路参见文章:

http://blog.csdn.net/ns_code/article/details/12977901

(1)前序

 1 void Pre_treverse(node *T)
 2 {
 3     stack<node *> STA;
 4     node *p=T;
 5     while(p || !STA.empty())
 6     {
 7         cout<<p->val;
 8         STA.push(p);
 9         p=p->left;
10         while(p==NULL && !STA.empty())
11         {
12             p=STA.top();
13             p=p->right;
14             STA.pop();
15         }
16     }
17 }

(2)中序

 1 void in_traverse(node *T)
 2 {
 3     stack<node *> STA;
 4     node *p=T;
 5     while(p || !STA.empty())
 6     {
 7         if(p->left)
 8         {
 9             STA.push(p);
10             p=p->left;
11         }
12         else
13         {
14             cout<<p->val<<endl;
15             p=p->right;
16             while(!p && !STA.empty())
17             {
18                 p=STA.top();
19                 cout<<p->val<<endl;
20                 STA.pop();
21                 p=p->right;
22             }
23         }
24     }
25 }

(3)后序

 1 void beh_traverse(node *T)
 2 {
 3     stack<node *>STA;
 4     node *p;
 5     node *pre=NULL;
 6     STA.push(T);
 7     while(!STA.empty())
 8     {
 9         p=STA.top();
10         if((p->left==NULL && p->right==NULL) || ((pre==NULL)&&(pre==p->left || pre==p->right)))
11         {
12             cout<<p->val<<endl;
13             STA.pop();
14             pre=p;
15         }
16         else
17         {
18             if(p->right)
19                 STA.push(p->right);
20             if(p->left)
21                 STA.push(p->left);
22         }
23     }
24 }

 

posted on 2015-07-11 17:25  Riden  阅读(511)  评论(0编辑  收藏  举报

导航