C++ 二叉树知识点

2021-03-04 13:29

阅读:593

标签:iostream   详细信息   dir   删除   temp   ==   分支   child   void   

 

  1 /**
  2  * C++ 语言: 二叉查找树
  3  *
  4  * @author skywang
  5  * @date 2013/11/07
  6  */
  7  
  8 #ifndef _BINARY_SEARCH_TREE_HPP_
  9 #define _BINARY_SEARCH_TREE_HPP_
 10  
 11 #include  12 #include  13 using namespace std;
 14  
 15 template class T>
 16 class BSTNode{
 17     public:
 18         T key;            // 关键字(键值)
 19         BSTNode *left;    // 左孩子
 20         BSTNode *right;    // 右孩子
 21         BSTNode *parent;// 父结点
 22  
 23         BSTNode(T value, BSTNode *p, BSTNode *l, BSTNode *r):
 24             key(value),parent(),left(l),right(r) {}
 25 };
 26  
 27 template class T>
 28 class BSTree {
 29     private:
 30         BSTNode *mRoot;    // 根结点
 31  
 32     public:
 33         BSTree();
 34         ~BSTree();
 35  
 36         // 前序遍历"二叉树"
 37         void preOrder();
 38         // 中序遍历"二叉树"
 39         void inOrder();
 40         // 后序遍历"二叉树"
 41         void postOrder();
 42  
 43         // (递归实现)查找"二叉树"中键值为key的节点
 44         BSTNode* search(T key);
 45         // (非递归实现)查找"二叉树"中键值为key的节点
 46         BSTNode* iterativeSearch(T key);
 47  
 48         // 查找最小结点:返回最小结点的键值。
 49         T minimum();
 50         // 查找最大结点:返回最大结点的键值。
 51         T maximum();
 52  
 53         // 找结点(x)的后继结点。即,查找"二叉树中数据值大于该结点"的"最小结点"。
 54         BSTNode* successor(BSTNode *x);
 55         // 找结点(x)的前驱结点。即,查找"二叉树中数据值小于该结点"的"最大结点"。
 56         BSTNode* predecessor(BSTNode *x);
 57  
 58         // 将结点(key为节点键值)插入到二叉树中
 59         void insert(T key);
 60  
 61         // 删除结点(key为节点键值)
 62         void remove(T key);
 63  
 64         // 销毁二叉树
 65         void destroy();
 66  
 67         // 打印二叉树
 68         void print();
 69     private:
 70         // 前序遍历"二叉树"
 71         void preOrder(BSTNode* tree) const;
 72         // 中序遍历"二叉树"
 73         void inOrder(BSTNode* tree) const;
 74         // 后序遍历"二叉树"
 75         void postOrder(BSTNode* tree) const;
 76  
 77         // (递归实现)查找"二叉树x"中键值为key的节点
 78         BSTNode* search(BSTNode* x, T key) const;
 79         // (非递归实现)查找"二叉树x"中键值为key的节点
 80         BSTNode* iterativeSearch(BSTNode* x, T key) const;
 81  
 82         // 查找最小结点:返回tree为根结点的二叉树的最小结点。
 83         BSTNode* minimum(BSTNode* tree);
 84         // 查找最大结点:返回tree为根结点的二叉树的最大结点。
 85         BSTNode* maximum(BSTNode* tree);
 86  
 87         // 将结点(z)插入到二叉树(tree)中
 88         void insert(BSTNode* &tree, BSTNode* z);
 89  
 90         // 删除二叉树(tree)中的结点(z),并返回被删除的结点
 91         BSTNode* remove(BSTNode* &tree, BSTNode *z);
 92  
 93         // 销毁二叉树
 94         void destroy(BSTNode* &tree);
 95  
 96         // 打印二叉树
 97         void print(BSTNode* tree, T key, int direction);
 98 };
 99  
100 /*
101  * 构造函数
102  */
103 template class T>
104 BSTree::BSTree():mRoot(NULL)
105 {
106 }
107  
108 /*
109  * 析构函数
110  */
111 template class T>
112 BSTree::~BSTree()
113 {
114     destroy();
115 }
116  
117 /*
118  * 前序遍历"二叉树"
119  */
120 template class T>
121 void BSTree::preOrder(BSTNode* tree) const
122 {
123     if(tree != NULL)
124     {
125         coutkey " " ;
126         preOrder(tree->left);
127         preOrder(tree->right);
128     }
129 }
130  
131 template class T>
132 void BSTree::preOrder()
133 {
134     preOrder(mRoot);
135 }
136  
137 /*
138  * 中序遍历"二叉树"
139  */
140 template class T>
141 void BSTree::inOrder(BSTNode* tree) const
142 {
143     if(tree != NULL)
144     {
145         inOrder(tree->left);
146         coutkey " " ;
147         inOrder(tree->right);
148     }
149 }
150  
151 template class T>
152 void BSTree::inOrder()
153 {
154     inOrder(mRoot);
155 }
156  
157 /*
158  * 后序遍历"二叉树"
159  */
160 template class T>
161 void BSTree::postOrder(BSTNode* tree) const
162 {
163     if(tree != NULL)
164     {
165         postOrder(tree->left);
166         postOrder(tree->right);
167         coutkey " " ;
168     }
169 }
170  
171 template class T>
172 void BSTree::postOrder()
173 {
174     postOrder(mRoot);
175 }
176  
177 /*
178  * (递归实现)查找"二叉树x"中键值为key的节点
179  */
180 template class T>
181 BSTNode* BSTree::search(BSTNode* x, T key) const
182 {
183     if (x==NULL || x->key==key)
184         return x;
185  
186     if (key key)
187         return search(x->left, key);
188     else
189         return search(x->right, key);
190 }
191  
192 template class T>
193 BSTNode* BSTree::search(T key)
194 {
195     search(mRoot, key);
196 }
197  
198 /*
199  * (非递归实现)查找"二叉树x"中键值为key的节点
200  */
201 template class T>
202 BSTNode* BSTree::iterativeSearch(BSTNode* x, T key) const
203 {
204     while ((x!=NULL) && (x->key!=key))
205     {
206         if (key key)
207             x = x->left;
208         else
209             x = x->right;
210     }
211  
212     return x;
213 }
214  
215 template class T>
216 BSTNode* BSTree::iterativeSearch(T key)
217 {
218     iterativeSearch(mRoot, key);
219 }
220  
221 /*
222  * 查找最小结点:返回tree为根结点的二叉树的最小结点。
223  */
224 template class T>
225 BSTNode* BSTree::minimum(BSTNode* tree)
226 {
227     if (tree == NULL)
228         return NULL;
229  
230     while(tree->left != NULL)
231         tree = tree->left;
232     return tree;
233 }
234  
235 template class T>
236 T BSTree::minimum()
237 {
238     BSTNode *p = minimum(mRoot);
239     if (p != NULL)
240         return p->key;
241  
242     return (T)NULL;
243 }
244  
245 /*
246  * 查找最大结点:返回tree为根结点的二叉树的最大结点。
247  */
248 template class T>
249 BSTNode* BSTree::maximum(BSTNode* tree)
250 {
251     if (tree == NULL)
252         return NULL;
253  
254     while(tree->right != NULL)
255         tree = tree->right;
256     return tree;
257 }
258  
259 template class T>
260 T BSTree::maximum()
261 {
262     BSTNode *p = maximum(mRoot);
263     if (p != NULL)
264         return p->key;
265  
266     return (T)NULL;
267 }
268  
269 /*
270  * 找结点(x)的后继结点。即,查找"二叉树中数据值大于该结点"的"最小结点"。
271  */
272 template class T>
273 BSTNode* BSTree::successor(BSTNode *x)
274 {
275     // 如果x存在右孩子,则"x的后继结点"为 "以其右孩子为根的子树的最小结点"。
276     if (x->right != NULL)
277         return minimum(x->right);
278  
279     // 如果x没有右孩子。则x有以下两种可能:
280     // (01) x是"一个左孩子",则"x的后继结点"为 "它的父结点"。
281     // (02) x是"一个右孩子",则查找"x的最低的父结点,并且该父结点要具有左孩子",找到的这个"最低的父结点"就是"x的后继结点"。
282     BSTNode* y = x->parent;
283     while ((y!=NULL) && (x==y->right))
284     {
285         x = y;
286         y = y->parent;
287     }
288  
289     return y;
290 }
291  
292 /*
293  * 找结点(x)的前驱结点。即,查找"二叉树中数据值小于该结点"的"最大结点"。
294  */
295 template class T>
296 BSTNode* BSTree::predecessor(BSTNode *x)
297 {
298     // 如果x存在左孩子,则"x的前驱结点"为 "以其左孩子为根的子树的最大结点"。
299     if (x->left != NULL)
300         return maximum(x->left);
301  
302     // 如果x没有左孩子。则x有以下两种可能:
303     // (01) x是"一个右孩子",则"x的前驱结点"为 "它的父结点"。
304     // (01) x是"一个左孩子",则查找"x的最低的父结点,并且该父结点要具有右孩子",找到的这个"最低的父结点"就是"x的前驱结点"。
305     BSTNode* y = x->parent;
306     while ((y!=NULL) && (x==y->left))
307     {
308         x = y;
309         y = y->parent;
310     }
311  
312     return y;
313 }
314  
315 /*
316  * 将结点插入到二叉树中
317  *
318  * 参数说明:
319  *     tree 二叉树的根结点
320  *     z 插入的结点
321  */
322 template class T>
323 void BSTree::insert(BSTNode* &tree, BSTNode* z)
324 {
325     BSTNode *y = NULL;
326     BSTNode *x = tree;
327  
328     // 查找z的插入位置
329     while (x != NULL)
330     {
331         y = x;
332         if (z->key key)
333             x = x->left;
334         else
335             x = x->right;
336     }
337  
338     z->parent = y;
339     if (y==NULL)
340         tree = z;
341     else if (z->key key)
342         y->left = z;
343     else
344         y->right = z;
345 }
346  
347 /*
348  * 将结点(key为节点键值)插入到二叉树中
349  *
350  * 参数说明:
351  *     tree 二叉树的根结点
352  *     key 插入结点的键值
353  */
354 template class T>
355 void BSTree::insert(T key)
356 {
357     BSTNode *z=NULL;
358  
359     // 如果新建结点失败,则返回。
360     if ((z=new BSTNode(key,NULL,NULL,NULL)) == NULL)
361         return ;
362  
363     insert(mRoot, z);
364 }
365  
366 /*
367  * 删除结点(z),并返回被删除的结点
368  *
369  * 参数说明:
370  *     tree 二叉树的根结点
371  *     z 删除的结点
372  */
373 template class T>
374 BSTNode* BSTree::remove(BSTNode* &tree, BSTNode *z)
375 {
376     BSTNode *x=NULL;
377     BSTNode *y=NULL;
378  
379     if ((z->left == NULL) || (z->right == NULL) )
380         y = z;
381     else
382         y = successor(z);
383  
384     if (y->left != NULL)
385         x = y->left;
386     else
387         x = y->right;
388  
389     if (x != NULL)
390         x->parent = y->parent;
391  
392     if (y->parent == NULL)
393         tree = x;
394     else if (y == y->parent->left)
395         y->parent->left = x;
396     else
397         y->parent->right = x;
398  
399     if (y != z)
400         z->key = y->key;
401  
402     return y;
403 }
404  
405 /*
406  * 删除结点(z),并返回被删除的结点
407  *
408  * 参数说明:
409  *     tree 二叉树的根结点
410  *     z 删除的结点
411  */
412 template class T>
413 void BSTree::remove(T key)
414 {
415     BSTNode *z, *node;
416  
417     if ((z = search(mRoot, key)) != NULL)
418         if ( (node = remove(mRoot, z)) != NULL)
419             delete node;
420 }
421  
422 /*
423  * 销毁二叉树
424  */
425 template class T>
426 void BSTree::destroy(BSTNode* &tree)
427 {
428     if (tree==NULL)
429         return ;
430  
431     if (tree->left != NULL)
432         return destroy(tree->left);
433     if (tree->right != NULL)
434         return destroy(tree->right);
435  
436     delete tree;
437     tree=NULL;
438 }
439  
440 template class T>
441 void BSTree::destroy()
442 {
443     destroy(mRoot);
444 }
445  
446 /*
447  * 打印"二叉查找树"
448  *
449  * key        -- 节点的键值
450  * direction  --  0,表示该节点是根节点;
451  *               -1,表示该节点是它的父结点的左孩子;
452  *                1,表示该节点是它的父结点的右孩子。
453  */
454 template class T>
455 void BSTree::print(BSTNode* tree, T key, int direction)
456 {
457     if(tree != NULL)
458     {
459         if(direction==0)    // tree是根节点
460             cout 2) key " is root"  endl;
461         else                // tree是分支节点
462             cout 2) key " is " 2) "‘s "  12) 1?"right child" : "left child")  endl;
463  
464         print(tree->left, tree->key, -1);
465         print(tree->right,tree->key,  1);
466     }
467 }
468  
469 template class T>
470 void BSTree::print()
471 {
472     if (mRoot != NULL)
473         print(mRoot, mRoot->key, 0);
474 }
475  
476 #endif
477 main.cpp
478 
479 /**
480  * C++ 语言: 二叉查找树
481  *
482  * @author skywang
483  * @date 2013/11/07
484  */
485  
486 #include 487 #include "BSTree.h"
488 using namespace std;
489  
490 static int arr[]= {1,5,4,3,2,6};
491 #define TBL_SIZE(a) ( (sizeof(a)) / (sizeof(a[0])) )
492  
493 int main()
494 {
495     int i, ilen;
496     BSTreeint>* tree=new BSTreeint>();
497  
498     cout "== 依次添加: ";
499     ilen = TBL_SIZE(arr);
500     for(i=0; i)
501     {
502         cout " ";
503         tree->insert(arr[i]);
504     }
505  
506     cout "\n== 前序遍历: ";
507     tree->preOrder();
508  
509     cout "\n== 中序遍历: ";
510     tree->inOrder();
511  
512     cout "\n== 后序遍历: ";
513     tree->postOrder();
514     cout  endl;
515  
516     cout "== 最小值: " minimum()  endl;
517     cout "== 最大值: " maximum()  endl;
518     cout "== 树的详细信息: "  endl;
519     tree->print();
520  
521     cout "\n== 删除根节点: " 3];
522     tree->remove(arr[3]);
523  
524     cout "\n== 中序遍历: ";
525     tree->inOrder();
526     cout  endl;
527  
528     // 销毁二叉树
529     tree->destroy();
530  
531     return 0;
532 }

 

C++ 二叉树知识点

标签:iostream   详细信息   dir   删除   temp   ==   分支   child   void   

原文地址:https://www.cnblogs.com/fby698/p/14349614.html


评论


亲,登录后才可以留言!