树的遍历总结

树结点定义

TreeNode
1 typedef struct Node
2 {
3 int value;
4 struct Node* left;
5 struct Node* right;
6 bool visited;
7 }iNode;

前序遍历的递归和非递归算法

PreOrder
 1 void PreOrder(iNode* r)
2 {
3 if(r==NULL)
4 return;
5 cout <<r->value<<" ";
6 PreOrder(r->left);
7 PreOrder(r->right);
8 }
9
10 void Pre_Order(iNode* r)
11 {
12 stack<iNode*> s;
13 iNode* tmp=new iNode;
14 tmp=r;
15 while(tmp!=NULL||!s.empty())
16 {
17 if(tmp!=NULL)
18 {
19 cout <<tmp->value<<" ";
20 s.push(tmp);
21 tmp=tmp->left;
22 }
23 else
24 {
25 iNode* node=s.top();
26 s.pop();
27 tmp=node->right;
28 }
29 }
30 }

中序遍历的递归和非递归算法

MidOrder
 1 void MidOrder(iNode* r)
2 {
3 if(r==NULL)
4 return;
5 MidOrder(r->left);
6 cout <<r->value<<" ";
7 MidOrder(r->right);
8 }
9
10
11 void Mid_Order(iNode* r)
12 {
13 stack<iNode*> s;
14 iNode* tmp=new iNode;
15 tmp=r;
16 while(tmp!=NULL||!s.empty())
17 {
18 if(tmp!=NULL)
19 {
20 s.push(tmp);
21 tmp=tmp->left;
22 }
23 else
24 {
25 tmp=s.top();
26 s.pop();
27 cout <<tmp->value<<" ";
28 tmp=tmp->right;
29 }
30 }
31 }

后序遍历的递归和非递归算法

PostOrder
 1 void PostOrder(iNode* r)
2 {
3 if(r==NULL)
4 return;
5 PostOrder(r->left);
6 PostOrder(r->right);
7 cout <<r->value<<" ";
8 }
9
10 void Post_Order(iNode* r)
11 {
12 stack<iNode*> s;
13 iNode* tmp=new iNode;
14 tmp=r;
15 while(tmp!=NULL||!s.empty())
16 {
17 if(tmp!=NULL)
18 {
19 s.push(tmp);
20 tmp=tmp->left;
21 }
22 else
23 {
24 tmp=s.top();
25 if(tmp->visited)
26 {
27 s.pop();
28 cout <<tmp->value<<" ";
29 tmp=NULL;
30 }
31 else
32 {
33 tmp->visited=true;
34 tmp=tmp->right;
35 }
36 }
37 }
38 }

树的构建,提示行有输入方法

TreeInit
 1 void Tree_Init(iNode* r)
2 {
3 int val;
4 int cnt=0;
5 queue<iNode*> q;
6 cout <<"Enter binary tree elements in level order,put zero if there is no node in corresponding position:";
7 while(cin >>val)
8 {
9 iNode* tmp=new iNode;
10 if(val==0)
11 tmp=NULL;
12 else
13 {
14 tmp->value=val;
15 tmp->visited=false;
16 }
17 if(q.empty())
18 {
19 r->value=val;
20 r->visited=false;
21 q.push(r);
22 }
23 else
24 {
25 while(q.front()==NULL)
26 q.pop();
27 iNode* parent=q.front();
28 if(cnt==0)
29 {
30 parent->left=tmp;
31 cnt=1;
32 }
33 else
34 {
35 parent->right=tmp;
36 q.pop();
37 cnt=0;
38 }
39 q.push(tmp);
40 }
41 }
42 while(!q.empty())
43 {
44 iNode* node=q.front();
45 if(node!=NULL)
46 {
47 node->left=NULL;
48 node->right=NULL;
49 }
50 q.pop();
51 }
52 }

测试程序

Main
 1 int main()
2 {
3 iNode *root=new iNode;
4 Tree_Init(root);
5 cout <<endl<<"The pre order is:";
6 PreOrder(root);
7 cout <<endl<<"The nonrecursion pre order is:";
8 Pre_Order(root);
9 cout <<endl<<"The middle order is:";
10 MidOrder(root);
11 cout <<endl<<"The nonrecursion middle order is:";
12 Mid_Order(root);
13 cout <<endl<<"The post order is:";
14 PostOrder(root);
15 cout <<endl<<"The nonrecursion post order is:";
16 Post_Order(root);
17 system("pause");
18 return 0;
19 }

 

posted @ 2011-12-12 21:16  Cavia  阅读(317)  评论(0)    收藏  举报