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

二叉树的构造和遍历——递归实现

时间:2014-11-15 16:49:28      阅读:131      评论:0      收藏:0      [点我收藏+]

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

一、二叉树的定义:

  二叉树是每个结点最多有两个子树的有序树。二叉树常被用于实现二叉查找树。值得注意的是,二叉树不是树的特殊情形。在图论中,二叉树是一个连通的无环图,并且每一个顶点的度不大于2。有根二叉树还要满足根结点的度不大于2。有了根结点后,每个顶点定义了唯一的根结点,和最多2个子结点。然而,没有足够的信息来区分左结点和右结点。

二、二叉树与树的区别:

  二叉树不是树的一种特殊情形,尽管其与树有许多相似之处,但树和二 叉树有两个主要差别:

1. 树中结点的最大度数没有限制,而二叉树结点的最大度数为2;

2. 树的结点无左、右之分,而二叉树的结点有左、右之分。

三、二叉树的遍历;
  二叉树的遍历分为先序遍历、中序遍历和后序遍历二叉树三种。
“遍历”是二叉树各种操作的基础,可以再遍历的过程中对结点进行各种操作,例如求结点的双亲、求结点的孩子结点、求二叉树的深度等操作都是建立在二叉树遍历的基础上,因此必须掌握二叉树的各种遍历过程,并能灵活运用一解决各种问题。
四、二叉树的构造和递归遍历实现代码如下
bubuko.com,布布扣
 1 #include <iostream>
 2 #include <string>
 3 #include <assert.h>
 4 #include <stdlib.h>
 5 #include <time.h>
 6 using namespace std;
 7 const int N =10;
 8 
 9 typedef struct node //二叉树的数据结构
10 {
11     int data_;
12     struct node* left_;
13     struct node* right_;
14 }BTree, *pBTree;
15 
16 void  Create_Btree_with_arr(pBTree &T, int *arr, int begin, int end)//len俄日数组的长度,也是树的结点数
17 {
18     if(begin > end)
19         return;
20 
21     int mid = (begin + end)/2;
22     if( T == NULL)
23     {
24         T =(pBTree)malloc(sizeof(BTree)); //申请空间
25         arr[mid] = rand()%100;
26         cout<< arr[mid] <<" ";
27         T->data_ = arr[mid]; //数值随机化
28         T->left_ = NULL;
29         T->right_ = NULL;
30     }
31     Create_Btree_with_arr(T->left_, arr, begin, mid-1);//左边(不包括T)
32     Create_Btree_with_arr(T->right_, arr, mid+1, end); //右边(不包括T)
33 }
34 
35 void Pre_Traversal(pBTree T) //前序遍历
36 {
37     if( T != NULL)
38     {
39         cout << T->data_ <<" ";
40         Pre_Traversal( T->left_);
41         Pre_Traversal( T->right_);
42     }
43 }
44 
45 void InOrder_Traversal( pBTree T)//中序遍历
46 {
47     if( T == NULL)
48         return;
49     InOrder_Traversal(T->left_);
50     cout << T->data_ <<" ";
51     InOrder_Traversal(T->right_);
52 }
53 
54 void PostOrder_Traversal( pBTree T) //后续遍历 ‘
55 {
56 
57     if( T != NULL)
58     {
59         PostOrder_Traversal( T->left_);
60         PostOrder_Traversal( T->right_);
61         cout << T->data_ <<" ";
62     }    
63 }
64 
65 void DestructBTree( pBTree &T) //二叉树的销毁
66 {
67     if( T == NULL)
68         return;
69 
70     DestructBTree( T->left_);
71     DestructBTree( T->right_);
72     free(T); //free之后的指针成为了野指针,内容并不为空
73     T = NULL;//置空
74 }
75 
76 int main(int argc, char const *argv[])
77 {
78     srand(time(NULL));
79     int arr[N]= {0};
80 
81     pBTree T =NULL;
82     Create_Btree_with_arr(T, arr, 0,N-1);
83     cout << endl;
84 
85     Pre_Traversal(T);
86     cout << endl;
87 
88     InOrder_Traversal(T);
89     cout << endl;
90 
91     PostOrder_Traversal(T);
92     cout << endl;
93 
94     DestructBTree(T);
95     cout <<"Free Over" << endl;
96     assert( T == NULL); //验证 T 是否真的被释放
97     return 0;
98 }
View Code

完毕。

二叉树的构造和遍历——递归实现

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

原文地址:http://www.cnblogs.com/xfxu/p/4099501.html

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