首页 > 代码库 > 二叉树的构造和遍历——递归实现

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

一、二叉树的定义:

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

二、二叉树与树的区别:

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

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

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

三、二叉树的遍历;
  二叉树的遍历分为先序遍历、中序遍历和后序遍历二叉树三种。
“遍历”是二叉树各种操作的基础,可以再遍历的过程中对结点进行各种操作,例如求结点的双亲、求结点的孩子结点、求二叉树的深度等操作都是建立在二叉树遍历的基础上,因此必须掌握二叉树的各种遍历过程,并能灵活运用一解决各种问题。
四、二叉树的构造和递归遍历实现代码如下
 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

完毕。

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