1 #include <stdio.h>
2 #include <stdlib.h>
3
4 // 二叉排序树数据结构
5 typedef struct BST
6 {
7 int data; // 数据部分
8 struct BST *lchild, *rchild; // 左右孩子
9 } BST, *BSTree;
10
11 // 求中序第一个元素
12 BSTree first_of_mideum(BSTree bst)
13 {
14 while (bst->lchild)
15 bst = bst->lchild;
16 return bst;
17 }
18 // 插入新元素
19 bool insert(BSTree &bst, int e)
20 {
21 if (bst == NULL)
22 {
23 BSTree btemp = (BST *)malloc(sizeof(BST));
24 btemp->data = e;
25 btemp->lchild = NULL;
26 btemp->rchild = NULL;
27 bst = btemp;
28 }
29 if (bst->data == e)
30 return false;
31 if (bst->data < e)
32 {
33 return insert(bst->lchild, e);
34 }
35 else
36 {
37 return insert(bst->rchild, e);
38 }
39 }
40 // 创建函数
41 BSTree createBST(int elements[], int n)
42 {
43 BSTree bst = NULL;
44 int i = 0;
45 while (i < n)
46 insert(bst, elements[i++]);
47 return bst;
48 }
49 // 查找函数
50 bool search(BSTree bst, int e)
51 {
52 if (bst == NULL)
53 return false;
54 if (bst->data == e)
55 return true;
56 else if (bst->data < e)
57 return search(bst->lchild, e);
58 else
59 return search(bst->rchild, e);
60 }
61 // 删除函数
62 bool del(BSTree &bst, int e)
63 {
64 if (bst == NULL)
65 return false;
66 if (bst->data == e)
67 {
68 if (bst->lchild == NULL && bst->rchild == NULL)
69 {
70 BSTree btemp = bst;
71 bst = NULL;
72 free(btemp);
73 return true;
74 }
75 else if (bst->lchild == NULL)
76 {
77 BSTree btemp = bst;
78 bst = bst->rchild;
79 free(btemp);
80 return true;
81 }
82 else if (bst->rchild == NULL)
83 {
84 BSTree btemp = bst;
85 bst = bst->lchild;
86 free(btemp);
87 return true;
88 }
89 else
90 {
91 BSTree btemp = first_of_mideum(bst);
92 BSTree btemp2 = bst;
93 bst = btemp;
94 free(btemp2);
95 del(btemp, btemp->data);
96 }
97 }
98 else if (bst->data < e)
99 return del(bst->lchild, e);
100 else
101 return del(bst->rchild, e);
102 }
103 int main()
104 {
105 BSTree bst = NULL;
106 int a[] = {1, 2, 3, 4, 5};
107 bst = createBST(a, 5);
108 printf("%d, %d, %d, %d, %d\n", search(bst, 1), search(bst, 2), search(bst, 3), search(bst, 4), search(bst, 5));
109 printf("%d, %d\n", del(bst, 4), del(bst, 8));
110 printf("%d, %d, %d, %d, %d\n", search(bst, 1), search(bst, 2), search(bst, 3), search(bst, 4), search(bst, 5));
111 return 0;
112 }