码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树遍历

时间:2015-04-29 21:25:45      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:

原文地址:http://blog.csdn.net/zhaoxianyong/article/details/7165386

  1 #include "stdafx.h"
  2 #include "stdlib.h"
  3 
  4 struct BiTreeNode
  5 {
  6     int c;
  7     struct BiTreeNode *left;
  8     struct BiTreeNode *right;
  9 };
 10  
 11 //先序遍历--递归
 12 int traverseBiTreePreOrder(BiTreeNode *ptree,int (*visit)(int))
 13 {
 14     if(ptree)
 15     {
 16         if(visit(ptree->c))
 17             if(traverseBiTreePreOrder(ptree->left,visit))
 18                 if(traverseBiTreePreOrder(ptree->right,visit))
 19                     return 1;
 20 
 21         return 0;
 22     }else return 1;
 23 }
 24 
 25 //中序遍历--递归
 26 int traverseBiTreeInOrder(BiTreeNode *ptree,int (*visit)(int))
 27 {
 28     if(ptree)
 29     {
 30         if(traverseBiTreeInOrder(ptree->left,visit))
 31             if(visit(ptree->c))
 32                 if(traverseBiTreeInOrder(ptree->right,visit))
 33                     return 1;
 34         return 0;
 35     }else return 1;
 36 }
 37 
 38 //后序遍历--递归
 39 int traverseBiTreePostOrder(BiTreeNode *ptree,int(*visit)(int))
 40 {
 41     if(ptree)
 42     {
 43         if(traverseBiTreePostOrder(ptree->left,visit))
 44             if(traverseBiTreePostOrder(ptree->right,visit))
 45                 if(visit(ptree->c))
 46                     return 1;
 47         return 0;
 48     }else return 1;
 49 }
 50 //visit为一函数指针,用于传递二叉树中对结点的操作方式,其原型为:int (*visit)(char)。
 51 
 52 //定义栈,用于使用非递归方法遍历二叉树
 53 struct Stack
 54 {
 55     BiTreeNode **top;
 56     BiTreeNode **base;
 57     int size;
 58 };
 59 #define  STACK_INIT_SIZE 100
 60 #define  STACK_INC_SIZE 10
 61 //初始化空栈
 62 Stack * initStack()
 63 {
 64     Stack *qs = NULL;
 65     qs = (Stack *)malloc(sizeof(Stack));
 66     qs->base = (BiTreeNode ** )calloc(STACK_INIT_SIZE,sizeof(BiTreeNode*));
 67     qs->top = qs->base;
 68     qs->size = STACK_INIT_SIZE;
 69     return qs;
 70 }
 71 //取栈顶数据
 72 BiTreeNode* getTop(Stack *qs)
 73 {
 74     BiTreeNode *ptree = NULL;
 75     if(qs->top == qs->base)
 76         return NULL;
 77     ptree = *(qs->top-1);
 78     return ptree;
 79 }
 80 //入栈操作
 81 int push(Stack *qs,BiTreeNode *ptree)
 82 {
 83     if(qs->top - qs->base >= qs->size)
 84     {
 85         qs->base = (BiTreeNode **)realloc(qs->base,(qs->size + STACK_INC_SIZE)*sizeof(BiTreeNode*));
 86         qs->top = qs->base + qs->size;
 87         qs->size += STACK_INC_SIZE;
 88     }
 89     *qs->top ++= ptree;
 90     return 1;
 91 }
 92 //出栈操作
 93 BiTreeNode* pop(Stack *qs)
 94 {
 95     if(qs->top == qs->base)
 96         return NULL;
 97     return *--qs->top;
 98 }
 99 //判断栈是否为空
100 int isEmpty(Stack *qs)
101 {
102     return qs->top == qs->base;
103 }
104 
105 //先序遍历--非递归
106 int traverseBiTreePreOrder2(BiTreeNode *ptree,int(*visit)(int))
107 {
108     Stack *qs = NULL;
109     BiTreeNode *pt = NULL;
110     qs = initStack();
111     pt = ptree;
112     while(pt|| !isEmpty(qs))
113     {
114         if(pt)
115         {
116             if(!visit(pt->c)) return 0;
117             push(qs,pt->right);
118             pt = pt->left;
119         }
120         else pt = pop(qs);
121     }
122     return 1;
123 }
124 //中序遍历--非递归 
125 int traverseBiTreeInOrder2(BiTreeNode* ptree,int (*visit)(int))
126 {
127     Stack *qs = NULL;
128     BiTreeNode *pt = NULL;
129     qs = initStack();
130     pt = ptree;
131     while(pt||!isEmpty(qs))
132     {
133         if(pt)
134         {
135             push(qs,pt);
136             pt = pt->left;
137         }
138         else
139         {
140             pt = pop(qs);
141             if(!visit(pt->c)) return 0;
142             pt = pt->right;
143         }
144     }
145     return 1;
146 }
147 //中序遍历--非递归--另一种实现方式  
148 int traverseBiTreeInOrder3(BiTreeNode *ptree,int(*visit)(int))
149 {
150     Stack *qs = NULL;
151     BiTreeNode *pt = NULL;
152     qs = initStack();
153     push(qs,ptree);
154     while(!isEmpty(qs))
155     {
156         while(pt = getTop(qs)) push(qs,pt->left);
157         pt = pop(qs);
158         if(!isEmpty(qs))
159         {
160             pt = pop(qs);
161             if(!visit(pt->c))return 0;
162             push(qs,pt->right);
163         }
164     }
165     return 1;
166 }
167 //后序遍历--非递归
168 int traverseBiTreePostOrder2(BiTreeNode *ptree,int (*visit)(int))
169 {
170     Stack *qs = NULL;
171     BiTreeNode *pt = NULL;
172     qs = initStack();
173     pt = ptree;
174     while(1)
175     {
176         if(pt)
177         {
178             push(qs,pt);
179             push(qs,pt->right);
180             pt = pt->left;
181         }
182         else if(!pt)
183         {
184             pt = pop(qs);
185             if(!pt)
186             {
187                 pt = pop(qs);
188                 if(!visit(pt->c)) return 0;
189                 if(isEmpty(qs))return 1;
190                 pt = pop(qs);
191             }
192             push(qs,NULL);
193         }
194     }
195     return 1;
196 }
197 //创建二叉树--先序输入--递归
198 BiTreeNode* createBitreePreOrder()
199 {
200     BiTreeNode *ptree = NULL;
201     char ch;
202     ch = getchar();
203     if(ch ==  )
204         ptree = NULL;
205     else
206     {
207         ptree = (struct BiTreeNode *) malloc(sizeof(BiTreeNode));
208         ptree->c = ch;
209         ptree->left = createBitreePreOrder();
210         ptree->right = createBitreePreOrder();
211     }
212     return ptree;
213 }
214 int _tmain(int argc, _TCHAR* argv[])
215 {
216     BiTreeNode *proot = NULL;
217     printf("InOrder input chars to create a Bitree:");
218     proot = createBitreePreOrder();//  先序输入的格式:ABC^^DE^G^^F^^^(其中^表示空格字符)
219     printf("PreOrder Output the Bitree recursively:");
220     traverseBiTreePreOrder(proot,putchar);
221     printf("\n");  
222     printf("PreOrder Output the BiTree non-recursively: ");  
223     traverseBiTreePreOrder2(proot,putchar);  
224     printf("\n");  
225     printf("InOrder Output the BiTree recursively: ");  
226     traverseBiTreeInOrder(proot,putchar);  
227     printf("\n");  
228     printf("InOrder Output the BiTree non-recursively(1): ");  
229     traverseBiTreeInOrder2(proot,putchar);  
230     printf("\n");  
231     printf("InOrder Output the BiTree non-recursively(2): ");  
232     traverseBiTreeInOrder3(proot,putchar);  
233     printf("\n");  
234     printf("PostOrder Output the BiTree non-recursively: ");  
235     traverseBiTreePostOrder(proot,putchar);  
236     printf("\n");  
237     printf("PostOrder Output the BiTree recursively: ");  
238     traverseBiTreePostOrder2(proot,putchar);  
239     printf("\n");  
240     
241     system("pause");
242     return 0;
243 }

输出:

技术分享

二叉树遍历

标签:

原文地址:http://www.cnblogs.com/nightcatcher/p/4466983.html

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