1. #include<iostream>   
2. #include<stack>   
3. #include<queue>   
4. using namespace std; 
5.  
6. //二叉树结点   
7. typedef struct BiTNode{ 
8.     //数据   
9.     char data; 
10.     //左右孩子指针   
11.     struct BiTNode *lchild,*rchild; 
12. }BiTNode,*BiTree; 
13.  
14. //按先序序列创建二叉树   
15. int CreateBiTree(BiTree &T){ 
16.     char data; 
17.     //按先序次序输入二叉树中结点的值(一个字符),‘#’表示空树   
18.     scanf("%c",&data); 
19.     if(data == '#'){ 
20.         T = NULL; 
21.     } 
22.     else{ 
23.         T = (BiTree)malloc(sizeof(BiTNode)); 
24.         //生成根结点   
25.         T->data = data; 
26.         //构造左子树   
27.         CreateBiTree(T->lchild); 
28.         //构造右子树   
29.         CreateBiTree(T->rchild); 
30.     } 
31.     return 0; 
32.
33. //输出   
34. void Visit(BiTree T){ 
35.     if(T->data != '#'){ 
36.         printf("%c ",T->data); 
37.     } 
38.
39. //先序遍历   
40. void PreOrder(BiTree T){ 
41.     if(T != NULL){ 
42.         //访问根节点   
43.         Visit(T); 
44.         //访问左子结点   
45.         PreOrder(T->lchild); 
46.         //访问右子结点   
47.         PreOrder(T->rchild); 
48.     } 
49.
50. //中序遍历     
51. void InOrder(BiTree T){   
52.     if(T != NULL){   
53.         //访问左子结点     
54.         InOrder(T->lchild);   
55.         //访问根节点     
56.         Visit(T);   
57.         //访问右子结点     
58.         InOrder(T->rchild);   
59.     }   
60. }   
61. //后序遍历   
62. void PostOrder(BiTree T){ 
63.     if(T != NULL){ 
64.         //访问左子结点   
65.         PostOrder(T->lchild); 
66.         //访问右子结点   
67.         PostOrder(T->rchild); 
68.         //访问根节点   
69.         Visit(T); 
70.     } 
71.
72. /* 先序遍历(非递归) 
73.    思路:访问T->data后,将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,再先序遍历T的右子树。 
74. */ 
75. void PreOrder2(BiTree T){ 
76.     stack<BiTree> stack; 
77.     //p是遍历指针   
78.     BiTree p = T; 
79.     //栈不空或者p不空时循环   
80.     while(p || !pty()){ 
81.         if(p != NULL){ 
82.             //存入栈中   
83.             stack.push(p); 
84.             //访问根节点   
85.             printf("%c ",p->data); 
86.             //遍历左子树   
87.             p = p->lchild; 
88.         } 
89.         else{ 
90.             //退栈   
91.             p =&p(); 
92.             stack.pop(); 
93.             //访问右子树   
94.             p = p->rchild; 
95.         } 
96.     }//while   
97.
98. /* 中序遍历(非递归) 
99.    思路:T是要遍历树的根指针,中序遍历要求在遍历完左子树后,访问根,再遍历右子树。 
100.          先将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,访问T->data,再中序遍历T的右子树。 
101. */ 
102. void InOrder2(BiTree T){ 
103.     stack<BiTree> stack; 
104.     //p是遍历指针   
105.     BiTree p = T; 
106.     //栈不空或者p不空时循环   
107.     while(p || !pty()){ 
108.         if(p != NULL){ 
109.             //存入栈中   
110.             stack.push(p); 
111.             //遍历左子树   
112.             p = p->lchild; 
113.         } 
114.         else{ 
115.             //退栈,访问根节点   
116.             p =&p(); 
117.             printf("%c ",p->data); 
118.             stack.pop(); 
119.             //访问右子树   
120.             p = p->rchild; 
121.         } 
122.     }//while   
123.
124.  
125. //后序遍历(非递归)   二叉树中序遍历非递归算法
126. typedef struct BiTNodePost{ 
127.     BiTree biTree; 
128.     char tag; 
129. }BiTNodePost,*BiTreePost; 
130.  
131. void PostOrder2(BiTree T){ 
132.     stack<BiTreePost> stack; 
133.     //p是遍历指针   
134.     BiTree p = T; 
135.     BiTreePost BT; 
136.     //栈不空或者p不空时循环   
137.     while(p != NULL || !pty()){ 
138.         //遍历左子树   
139.         while(p != NULL){ 
140.             BT = (BiTreePost)malloc(sizeof(BiTNodePost)); 
141.             BT->biTree = p; 
142.             //访问过左子树   
143.             BT->tag = 'L'; 
144.             stack.push(BT); 
145.             p = p->lchild; 
146.         } 
147.         //左右子树访问完毕访问根节点   
148.         while(!pty() && (p())->tag == 'R'){ 
149.             BT =&p(); 
150.             //退栈   
151.             stack.pop(); 
152.             BT->biTree; 
153.             printf("%c ",BT->biTree->data); 
154.         } 
155.         //遍历右子树   
156.         if(!pty()){ 
157.             BT =&p(); 
158.             //访问过右子树   
159.             BT->tag = 'R'; 
160.             p = BT->biTree; 
161.             p = p->rchild; 
162.         } 
163.     }//while   
164.
165. //层次遍历   
166. void LevelOrder(BiTree T){ 
167.     BiTree p = T; 
168.     //队列   
169.     queue<BiTree> queue; 
170.     //根节点入队   
171.     queue.push(p); 
172.     //队列不空循环   
173.     while(!pty()){ 
174.         //对头元素出队   
175.         p = queue.front(); 
176.         //访问p指向的结点   
177.         printf("%c ",p->data); 
178.         //退出队列   
179.         queue.pop(); 
180.         //左子树不空,将左子树入队   
181.         if(p->lchild != NULL){ 
182.             queue.push(p->lchild); 
183.         } 
184.         //右子树不空,将右子树入队   
185.         if(p->rchild != NULL){ 
186.             queue.push(p->rchild); 
187.         } 
188.     } 
189.
190. int main() 

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。