码迷,mamicode.com
首页 > 编程语言 > 详细

C语言非递归实现二叉树的先序、中序、后序遍历

时间:2014-11-30 22:57:43      阅读:305      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   sp   on   

  1 #include <stdio.h>        
  2 #include <stdlib.h>        
  3 #define INIT_STACK_SIZE 100        
  4 #define STACKINCREMENT 10        
  5         
  6 //*****二叉树的二叉链表存储结构*****//    
  7 typedef struct BiNode        
  8 {        
  9     char data;        
 10     struct BiNode *lchild, *rchild;       
 11     int visitcount;                 //访问次数(后序遍历会用到)    
 12 }BiNode, *BiTree;        
 13         
 14 typedef struct        
 15 {        
 16     BiNode **base;        
 17     BiNode **top;        
 18     int stacksize;        
 19 }SqStack;        
 20     
 21 //*****初始化栈*****//       
 22 void InitStack(SqStack &S)                     
 23 {        
 24     if (!(S.base = (BiNode **)malloc(sizeof(BiTree) * INIT_STACK_SIZE)))        
 25     {        
 26         return;        
 27     }        
 28     S.top = S.base;        
 29     S.stacksize = INIT_STACK_SIZE;        
 30         
 31     return;        
 32 }        
 33         
 34 //*****元素进栈*****//    
 35 void Push(SqStack &S, BiNode *e)               
 36 {        
 37     if (S.top - S.base >= S.stacksize)        
 38     {        
 39         if (!(S.base = (BiNode **)realloc(S.base, sizeof(BiTree) * (STACKINCREMENT + S.stacksize))))      
 40         {        
 41             return;        
 42         }        
 43         S.stacksize += STACKINCREMENT;        
 44     }        
 45     *S.top++ = e;        
 46         
 47     return;        
 48 }        
 49         
 50 //*****元素出栈*****//    
 51 void Pop(SqStack &S, BiNode **e)               
 52 {        
 53     if (S.base == S.top)        
 54     {        
 55         return;        
 56     }        
 57     *e = *--S.top;        
 58         
 59     return;        
 60 }        
 61     
 62 //*****取栈顶元素*****//        
 63 int GetTop(SqStack S, BiNode **e)        
 64 {        
 65     if (S.base == S.top)        
 66     {        
 67         return 0;        
 68     }        
 69     *e = *(S.top - 1);        
 70             
 71     return 1;        
 72 }        
 73         
 74 //*****判断栈是否为空*****//      
 75 int StackEmpty(SqStack S)             
 76 {        
 77     if (S.top == S.base)        
 78         return 1;        
 79     else        
 80         return 0;        
 81 }        
 82     
 83 //*****按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树构造二叉链表表示的二叉树T*****//        
 84 void CreateBiTree(BiTree &T)                
 85 {                                           
 86     char ch;          
 87     scanf("%c", &ch);          
 88     if(ch ==  )          
 89     {          
 90         T = NULL;          
 91     }          
 92     else          
 93     {          
 94         if(!(T = (BiNode *)malloc(sizeof(BiNode))))           
 95         {          
 96             return;          
 97         }          
 98         T->data = ch;                    //生成根结点          
 99         CreateBiTree(T->lchild);     //构造左子树          
100         CreateBiTree(T->rchild);     //构造右子树          
101     }          
102             
103     return;          
104 }          
105     
106 //*****先序遍历二叉树方法1*****//     
107 void PreorderTraverse_1(BiTree T)                           
108 {      
109     BiTree p;      
110     SqStack S;      
111     InitStack(S);      
112     Push(S, T);                                         //根指针进栈      
113     while(!StackEmpty(S))      
114     {      
115         while(GetTop(S, &p) && p)       
116         {                                                     
117             printf("%c ", p->data);                            
118             Push(S, p->lchild);       
119         }      
120         Pop(S, &p);                                     //空指针退栈        
121         if(!StackEmpty(S))      
122         {      
123             Pop(S, &p);                                 //根结点出栈      
124             Push(S,p->rchild);                           //右孩子进栈      
125         }      
126     }      
127         
128     return;      
129 }      
130     
131 //*****先序遍历二叉树方法2*****//     
132 void PreorderTraverse_2(BiTree T)                             
133 {        
134     BiTree p = T;        
135     SqStack S;        
136     InitStack(S);        
137         
138     while (p || !StackEmpty(S))        
139     {        
140         if (p)        
141         {        
142             printf("%c ", p->data);      
143             Push(S,p);        
144             p = p->lchild;        
145         }        
146         else        
147         {        
148             Pop(S, &p);        
149             p = p->rchild;        
150         }        
151     }        
152 }     
153     
154 //*****中序遍历二叉树方法1*****//     
155 void InOrderTraverse_1(BiTree T)                            
156 {      
157     SqStack S;      
158     BiTree p;      
159     InitStack(S);      
160     Push(S,T);         
161     while (!StackEmpty(S))      
162     {      
163         while (GetTop(S,&p) && p)        
164         {      
165             Push(S,p->lchild);                           //向左走到尽头      
166         }      
167         Pop(S,&p);                                      //空指针退栈        
168         if (!StackEmpty(S))      
169         {        
170             Pop(S,&p);        
171             printf("%c ", p->data);      
172             Push(S,p->rchild);      
173         }      
174     }      
175         
176     return;      
177 }      
178     
179 //*****中序遍历二叉树方法2*****//     
180 void InOrderTraverse_2(BiTree T)                             
181 {        
182     BiTree p = T;        
183     SqStack S;        
184     InitStack(S);        
185         
186     while (p || !StackEmpty(S))        
187     {        
188         if (p)        
189         {        
190             Push(S,p);        
191             p = p->lchild;        
192         }        
193         else        
194         {        
195             Pop(S, &p);        
196             printf("%c ", p->data);        
197             p = p->rchild;        
198         }        
199     }       
200         
201     return;      
202 }             
203     
204 //*****后序遍历二叉树*****//     
205 void PostOrderTraverse(BiTree T)      
206 {      
207     SqStack S;      
208     BiTree p = T;      
209     InitStack(S);      
210           
211     while (p || !StackEmpty(S))      
212     {      
213         if(p)      
214         {      
215             if (p->visitcount != 2)      
216             {      
217                 p->visitcount = 1;      
218                 Push(S, p);      
219             }      
220             p = p->lchild;      
221         }      
222         else       
223         {                 
224             Pop(S, &p);        
225             if(p->visitcount == 2)      
226             {      
227                 printf("%c ", p->data);        
228             }      
229             else       
230             {       
231                 p->visitcount++;       
232                 Push(S, p);      
233             }      
234             p = p->rchild;      
235         }      
236     }      
237           
238     return;      
239 }      
240       
241 int main(void)        
242 {        
243     BiTree T;        
244     printf("请按先序次序输入二叉树中结点的值(字符),空格字符表示空树:\n");    
245     CreateBiTree(T);        
246         
247     printf("先序遍历方法1结果为:");    
248     PreorderTraverse_1(T);    
249     printf("\n\n");     
250     
251     printf("先序遍历方法2结果为:");    
252     PreorderTraverse_2(T);    
253     printf("\n\n");     
254     
255     printf("中序遍历方法1结果为:");    
256     InOrderTraverse_1(T);    
257     printf("\n\n");     
258         
259     printf("中序遍历方法2结果为:");    
260     InOrderTraverse_2(T);    
261     printf("\n\n");     
262     
263     printf("后序遍历结果为:");    
264     PostOrderTraverse(T);        
265     printf("\n\n");        
266         
267     return 0;        
268 }        

以如下二叉树为例,给出按先序次序输入二叉树中结点的值(字符),从而按照本文给出的算法构造二叉树。

bubuko.com,布布扣

输入字符的顺序是:-+a空格空格*b空格空格-c空格空格d空格空格/e空格空格f空格空格,即可验证本文给出的遍历算法。

C语言非递归实现二叉树的先序、中序、后序遍历

标签:style   blog   http   io   ar   color   os   sp   on   

原文地址:http://www.cnblogs.com/mengwang024/p/4133815.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!