一、二叉树的定义:
二叉树是每个结点最多有两个子树的有序树。二叉树常被用于实现二叉查找树。值得注意的是,二叉树不是树的特殊情形。在图论中,二叉树是一个连通的无环图,并且每一个顶点的度不大于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 }
完毕。
时间: 2024-10-22 10:13:37