二叉树

binaryTree.h

  1 #ifndef BINARYTREE_H
  2 #define BINARYTREE_H
  3 
  4 #include<iostream>
  5 using namespace std;
  6 
  7 #include<cstdlib>
  8 #include<stack>
  9 #include<queue>
 10 
 11 enum Status{ERROR,OK};//定义状态枚举时还得注意实际的值,不能搞错了
 12 
 13 template<class T>
 14 Status PrintElement(T e)
 15 {
 16     cout<<e<<" ";
 17     return OK;
 18 }
 19 
 20 template<class T>
 21 class BiNode//树节点
 22 {
 23 public:
 24     BiNode();
 25     T data;
 26     BiNode *left;
 27     BiNode *right;
 28 };
 29 
 30 template<class T>
 31 BiNode<T>::BiNode()
 32 {
 33     data = (T)0;
 34     left = NULL;
 35     right = NULL;//有时候你初始化指针值为NULL,你也没有在后面的语句中刻意去改变该指针值,但指针的值还是可能因为传递到函数作为参数而发生改变,因此如果你要再重新用指针的NULL值,最好在用之前显示地再重新赋值一下才行
 36 }
 37 
 38 template<class T>
 39 class BiTree
 40 {
 41 public:
 42     BiTree();
 43     Status CreateBiTree(BiNode<T> *&root);
 44     Status PreOrderTraverse(BiNode<T> *r,Status (*visit)(T element));//前序遍历,递归方法
 45     Status NPreOrderTraverse(BiNode<T> *r,Status (*visit)(T element));//前序遍历,非递归方法
 46     Status InOrderTraverse(BiNode<T> *r,Status (*visit)(T element));//中序遍历,递归方法
 47     Status NInOrderTraverse(BiNode<T> *r,Status (*visit)(T element));//中序遍历,非递归方法
 48     Status PostOrderTraverse(BiNode<T> *r,Status (*visit)(T element));//后序遍历,递归方法
 49     Status NPostOrderTraverse(BiNode<T> *r,Status (*visit)(T element));//后序遍历,非递归方法
 50     Status LevelTraverse(BiNode<T> *r,Status (*visit)(T element));//层次遍历
 51     Status BiTraverse();
 52     ~BiTree();
 53 
 54 private:
 55     BiNode<T> *root;//树根节点
 56 };
 57 
 58 template<class T>
 59 BiTree<T>::BiTree()
 60 {
 61     CreateBiTree(root);
 62 }
 63 
 64 template<class T>
 65 Status BiTree<T>::CreateBiTree(BiNode<T> *&r)//这里即使是指针也得加&符号,这样才能真正修改root,不然修改不了(还认为是值传递)
 66 {
 67     r = NULL;
 68     T ch;
 69     cin>>ch;
 70     if(ch != (T)0)
 71     {
 72         r = new BiNode<T>();
 73         if(r != NULL)
 74         {
 75             r->data = ch;
 76             CreateBiTree(r->left);
 77             CreateBiTree(r->right);
 78         }
 79     }
 80     else
 81     {
 82         r = NULL;
 83         //r = new BiNode<T>();
 84         //r->data = (T)0;//这里的左右孩子不存在的节点我们规定其data值为0,方便后面遍历时进行判断,不为0则输出并继续递归,为0则直接返回
 85     }
 86     return OK;
 87 }
 88 
 89 template<class T>
 90 Status BiTree<T>::PreOrderTraverse(BiNode<T> *r,Status (*visit)(T element))//前序遍历递归方法
 91 {
 92     if(r != NULL)
 93     {
 94         if((*visit)(r->data))
 95         {
 96             if(PreOrderTraverse(r->left,visit))
 97             {
 98                 if(PreOrderTraverse(r->right,visit))
 99                 {
100                     return OK;
101                 }
102             }
103         }
104         return ERROR;
105     }
106     else
107     {
108         return OK;
109     }
110 }
111 
112 template<class T>
113 Status BiTree<T>::NPreOrderTraverse(BiNode<T> *r,Status (*visit)(T element))//前序遍历非递归方法(栈)
114 {
115     stack<BiNode<T> *>s;
116     BiNode<T> *temp = r;
117 
118     while(true)
119     {
120         while(temp != NULL)
121         {
122             if(temp->right != NULL)
123             {
124                 s.push(temp->right);
125             }
126             visit(temp->data);
127             temp = temp->left;
128         }
129         if(!s.empty())
130         {
131             temp = s.top();
132             s.pop();
133         }
134         else
135         {
136             break;
137         }
138     }
139     return OK;
140 }
141 
142 template<class T>
143 Status BiTree<T>::InOrderTraverse(BiNode<T> *r,Status (*visit)(T element))//中序遍历,递归方法
144 {
145     if(r != NULL)
146     {
147         if(InOrderTraverse(r->left,visit))
148         {
149             if((*visit)(r->data))
150             {
151                 if(InOrderTraverse(r->right,visit))
152                 {
153                     return OK;
154                 }
155             }
156         }
157         return ERROR;
158     }
159     else
160     {
161         return OK;
162     }
163 
164     return OK;
165 }
166 
167 template<class T>
168 Status BiTree<T>::NInOrderTraverse(BiNode<T> *r,Status (*visit)(T element))//中序遍历,非递归方法(栈)
169 {
170     stack<BiNode<T> *> s;
171     BiNode<T> *temp;
172     s.push(r);
173     while(!s.empty())
174     {
175         while((temp = (BiNode<T> *)s.top()) && temp != NULL)
176         {
177             s.push(temp->left);
178         }
179         s.pop();
180         if(!s.empty())
181         {
182             temp = s.top();
183             visit(temp->data);
184             s.pop();
185             s.push(temp->right);
186         }
187     }
188 
189     return OK;
190 }
191 
192 template<class T>
193 Status BiTree<T>::PostOrderTraverse(BiNode<T> *r,Status (*visit)(T element))//后序遍历递归算法
194 {
195     if(r != NULL)
196     {
197         if(PostOrderTraverse(r->left,visit))
198         {
199             if(PostOrderTraverse(r->right,visit))
200             {
201                 if((*visit)(r->data))
202                 {
203                     return OK;
204                 }
205             }
206         }
207         return ERROR;
208     }
209     else
210     {
211         return OK;
212     }
213 
214     return OK;
215 }
216 
217 template<class T>
218 Status BiTree<T>::NPostOrderTraverse(BiNode<T> *r,Status (*visit)(T element))//后序遍历非递归算法(栈)
219 {
220     stack<BiNode<T> *> s;
221     BiNode<T> *temp = r;//这里要赋初值不能忘了
222     s.push(temp);
223     while(!s.empty())//任何时候都必须要判定是否为空
224     {
225         while((temp = s.top())&&temp)
226         {
227             s.push(temp->left);
228         }
229         s.pop();
230         if(!s.empty())
231         {
232             while(temp == (s.top())->right || (temp == (s.top())->left) && ((s.top())->right == NULL))
233             {
234                 temp = s.top();
235                 visit(temp->data);
236                 s.pop();
237                 if(s.empty())//这里是条件一定要判断准确了,是empty()而不是!empty()
238                 {
239                     break;
240                 }
241             }
242             if(!s.empty())
243             {
244                 temp = s.top();
245                 s.push(temp->right);
246             }
247         }
248         else
249         {
250             break;
251         }
252     }
253 
254     return OK;
255 }
256 
257 template<class T>
258 Status BiTree<T>::LevelTraverse(BiNode<T> *r,Status (*visit)(T element))
259 {
260     queue<BiNode<T> *> qu;
261     BiNode<T> *temp;
262     if(!r)
263     {
264         qu.push(r);
265         while(!qu.empty())
266         {
267             temp = qu.front();
268             visit(temp->data);
269             if(temp->left)
270             {
271                 qu.push(temp->left);
272             }
273             if(temp->right)
274             {
275                 qu.push(temp->right);
276             }
277             qu.pop();
278         }
279     }
280 
281     return OK;
282 }
283 
284 template<class T>
285 Status BiTree<T>::BiTraverse()
286 {
287     cout<<"Recursive traverse:"<<endl;
288 
289     cout<<"preorder traverse :"<<endl;
290     PreOrderTraverse(root,PrintElement);
291 
292     cout<<endl<<"inorder traverse :"<<endl;
293     InOrderTraverse(root,PrintElement);
294 
295     cout<<endl<<"postorder traverse :"<<endl;
296     PostOrderTraverse(root,PrintElement);
297 
298     cout<<endl<<"Non-recursive traverse:"<<endl;
299 
300     cout<<endl<<"NPreorder traverse:"<<endl;
301     NPreOrderTraverse(root,PrintElement);
302     
303     cout<<endl<<"NInorder treaverse:"<<endl;
304     NInOrderTraverse(root,PrintElement);
305 
306     cout<<endl<<"NPostorder traverse:"<<endl;
307     NPostOrderTraverse(root,PrintElement);
308     
309     cout<<endl<<"Level traverse:"<<endl;
310     LevelTraverse(root,PrintElement);
311 
312     return OK;
313 }
314 
315 template<class T>
316 BiTree<T>::~BiTree()//最后在析构函数里使用中序非递归遍历算法进行树节点遍历进而释放内存空间
317 {
318     stack<BiNode<T> *> s;
319     BiNode<T> *temp;
320     s.push(r);
321     while(!s.empty())
322     {
323         while((temp = (BiNode<T> *)s.top()) && temp != NULL)
324         {
325             s.push(temp->left);
326         }
327         s.pop();
328         if(!s.empty())
329         {
330             temp = s.top();
331             delete temp;
332             s.pop();
333             s.push(temp->right);
334         }
335     }
336 }
337 
338 #endif

main.cpp

 1 #include<iostream>
 2 
 3 using namespace std;
 4 #include<stdlib.h>
 5 #include"binaryTree.h"
 6 
 7 int main()
 8 {
 9     cout<<"please input a series number to create a binarytree :"<<endl;
10     BiTree<int> *t1 = new BiTree<int>();//new永远是返回指针
11 
12     t1->BiTraverse();
13 
14 
15     system("pause");
16     return 0;
17 }

 

posted @ 2012-12-06 22:49  maowang  阅读(367)  评论(0编辑  收藏  举报