讲解:
总结一句话:
小的左边,大的放右边。
特点:
二叉排序树(Binary Sort Tree),又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树。
若它的左子树不空,则左子树上所有结点的值均小于它的根结构的值;
若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
它的左、右子树也分别为二又排序树。
二叉树创建代码:
1 //创建二叉树 2 void InsertBST(BiTree* &T, int elem) { 3 BiTree *p = new BiTree; 4 p->data = elem; 5 p->lchild = NULL; 6 p->rchild = NULL; 7 if (!T) { 8 T = p;//为空树 9 return; 10 } 11 12 if (T->data == elem) 13 return;//此数已经存在 14 15 while (true) { 16 if (elem > T->data) { 17 if (T->rchild != NULL) 18 T = T->rchild;//走到最右端 19 else { 20 T->rchild = p;//添加为右子树 21 return; 22 } 23 } 24 else { 25 if (T->lchild != NULL) 26 T = T->lchild;//走到最左端 27 else { 28 T->lchild = p;//添加为左子树 29 return; 30 } 31 } 32 } 33 34 }
二叉树排序:
通过二叉树的中序遍历,得到的就是一个有序数组
代码:
1 void ShowTree(BiTree *T) { 2 //进行中序浏览 3 if (T) { 4 ShowTree(T->lchild); 5 cout << T->data << "—>"; 6 ShowTree(T->rchild); 7 } 8 }
二叉树查找:
使用递归,通过比较大小来找到左子树或右子树。
二叉树查找代码:
1 //对二叉树进行查找工作 2 int SearchData(BiTree *T, int num) { 3 if (!T)return 0; 4 if (T->data == num)return 1; 5 if (num > T->data)SearchData(T->rchild,num); 6 else SearchData(T->lchild, num); 7 }
二叉树的删除是重点也是难点:
当要删除节点位于右端末,即无右子树,则用它的左子树接替他的位置;
当要删除节点位于左端末,即无左子树,则用它的右子树接替他的位置;
当要删除节点位于中间,即既有左子树,又有右子树,用左子树的最大数代替,即左子树的最右端末。
删除代码:
1 //进行删除 2 //重点,也是难点 3 int Delete(BiTree* &T) { 4 BiTree *p, *q; 5 if (T->rchild == NULL) {//若该结点没有右子树,则将该节点的左子树代替其,并删除 6 p = T; 7 T = T->lchild; 8 delete(p); 9 } 10 else if (T->lchild == NULL) {//若该结点没有左子树,则将该节点的右子树代替其,并删除 11 p = T; 12 T = T->rchild; 13 delete(p); 14 } 15 else {//左右子树都存在 16 p = T; 17 q = T->lchild; 18 while (q->rchild) {//走到T左支的末端,此时他是左边最大的数 19 p = q;//记住前端点 20 q = q->rchild; 21 } 22 T->data = q->data;//前驱的数字用最右端数字代替 23 if (p != T)//将末端的左孩子连接,因为此时他是左端最大的数字 24 p->rchild = q->lchild; 25 else 26 p->lchild = q->lchild;//重接左子树 27 delete(q);//释放左端最大值 28 } 29 return 1; 30 } 31 32 33 //对二叉树进行删除操作 34 int DeleteBST(BiTree* &T, int num) { 35 if (!T)return false; 36 if (num == T->data) { 37 Delete(T); 38 return true; 39 } 40 else if (num > T->data)DeleteBST(T->rchild, num); 41 DeleteBST(T->lchild, num); 42 }
完整代码:
1 #include "000库函数.h" 2 3 #define MAXSIZE 100 4 5 6 //二叉树的结构 7 struct BiTree 8 { 9 int data; 10 BiTree *lchild, *rchild; 11 }; 12 13 //创建二叉树 14 void InsertBST(BiTree* &T, int elem) { 15 BiTree *p = new BiTree; 16 p->data = elem; 17 p->lchild = NULL; 18 p->rchild = NULL; 19 if (!T) { 20 T = p;//为空树 21 return; 22 } 23 24 if (T->data == elem) 25 return;//此数已经存在 26 27 while (true) { 28 if (elem > T->data) { 29 if (T->rchild != NULL) 30 T = T->rchild;//走到最右端 31 else { 32 T->rchild = p;//添加为右子树 33 return; 34 } 35 } 36 else { 37 if (T->lchild != NULL) 38 T = T->lchild;//走到最左端 39 else { 40 T->lchild = p;//添加为左子树 41 return; 42 } 43 } 44 } 45 46 } 47 48 void ShowTree(BiTree *T) { 49 //进行中序浏览 50 if (T) { 51 ShowTree(T->lchild); 52 cout << T->data << "—>"; 53 ShowTree(T->rchild); 54 } 55 } 56 57 //对二叉树进行查找工作 58 int SearchData(BiTree *T, int num) { 59 if (!T)return 0; 60 if (T->data == num)return 1; 61 if (num > T->data)SearchData(T->rchild,num); 62 else SearchData(T->lchild, num); 63 } 64 65 66 //进行删除 67 //重点,也是难点 68 int Delete(BiTree* &T) { 69 BiTree *p, *q; 70 if (T->rchild == NULL) {//若该结点没有右子树,则将该节点的左子树代替其,并删除 71 p = T; 72 T = T->lchild; 73 delete(p); 74 } 75 else if (T->lchild == NULL) {//若该结点没有左子树,则将该节点的右子树代替其,并删除 76 p = T; 77 T = T->rchild; 78 delete(p); 79 } 80 else {//左右子树都存在 81 p = T; 82 q = T->lchild; 83 while (q->rchild) {//走到T左支的末端,此时他是左边最大的数 84 p = q;//记住前端点 85 q = q->rchild; 86 } 87 T->data = q->data;//前驱的数字用最右端数字代替 88 if (p != T)//将末端的左孩子连接,因为此时他是左端最大的数字 89 p->rchild = q->lchild; 90 else 91 p->lchild = q->lchild;//重接左子树 92 delete(q);//释放左端最大值 93 } 94 return 1; 95 } 96 97 98 //对二叉树进行删除操作 99 int DeleteBST(BiTree* &T, int num) { 100 if (!T)return false; 101 if (num == T->data) { 102 Delete(T); 103 return true; 104 } 105 else if (num > T->data)DeleteBST(T->rchild, num); 106 DeleteBST(T->lchild, num); 107 } 108 109 int T032(void) 110 { 111 int i; 112 int a[10] = { 62,88,58,47,35,73,51,99,37,93 }; 113 BiTree *T = new BiTree; 114 T = NULL; 115 BiTree *p; 116 for (i = 0; i < 10; i++) { 117 InsertBST(T, a[i]); 118 if (i == 0) 119 p = T;//记住头结点的位置 120 T = p;//仍然返回头结点,从头结点开始重新遍历 121 } 122 ShowTree(T); 123 cout << endl; 124 cout << "找到没?" << endl << SearchData(T, 99) << endl; 125 p = T;//记住头结点 126 DeleteBST(T, 93); 127 T = p; 128 ShowTree(T); 129 cout << endl; 130 p = T;//记住头结点 131 DeleteBST(T, 37); 132 T = p; 133 ShowTree(T); 134 cout << endl; 135 return 0; 136 }