1 #include <stdio.h>
2 #include <stdlib.h>
3
4 #define MaxSize 1000
5
6 typedef int ElementType;
7
8 struct BinarySearchTreeNode
9 {
10 ElementType Element;
11 struct BinarySearchTreeNode *Left;
12 struct BinarySearchTreeNode *Right;
13 };
14
15 struct BinarySearchTreeNode *BinarySearchTreeInit()
16 {
17 struct BinarySearchTreeNode *TreeRoot = NULL;
18
19 return TreeRoot;
20 }
21
22 int BinarySearchTreeDestroy(struct BinarySearchTreeNode *TreeRoot)
23 {
24 if(TreeRoot != NULL)
25 {
26 BinarySearchTreeDestroy(TreeRoot -> Left);
27 BinarySearchTreeDestroy(TreeRoot -> Right);
28 free(TreeRoot);
29 }
30 return 0;
31 }
32
33 struct BinarySearchTreeNode *BinarySearchTreeNodeFind(ElementType ToBeFind,struct BinarySearchTreeNode *TreeRoot)
34 {
35 if(TreeRoot==NULL)
36 {
37 return NULL;
38 }
39
40 if(ToBeFind < TreeRoot -> Element)
41 {
42 return BinarySearchTreeNodeFind(ToBeFind,TreeRoot->Left);
43 }
44 else if(ToBeFind > TreeRoot -> Element)
45 {
46 return BinarySearchTreeNodeFind(ToBeFind,TreeRoot->Right);
47 }
48 else
49 {
50 return TreeRoot;
51 }
52 }
53
54 struct BinarySearchTreeNode *BinarySearchTreeNodeFindMin(struct BinarySearchTreeNode *TreeRoot)
55 {
56 if(TreeRoot==NULL)
57 {
58 return NULL;
59 }
60 else if(TreeRoot->Left==NULL)
61 {
62 return TreeRoot;
63 }
64 else
65 {
66 return BinarySearchTreeNodeFindMin(TreeRoot->Left);
67 }
68 }
69
70 struct BinarySearchTreeNode *BinarySearchTreeNodeFindMax(struct BinarySearchTreeNode *TreeRoot)
71 {
72 if(TreeRoot==NULL)
73 {
74 return NULL;
75 }
76 else if(TreeRoot->Right==NULL)
77 {
78 return TreeRoot;
79 }
80 else
81 {
82 return BinarySearchTreeNodeFindMax(TreeRoot->Right);
83 }
84 }
85
86 //be careful of return NULL
87 struct BinarySearchTreeNode *BinarySearchTreeNodeInsert(ElementType ToBeInsert,struct BinarySearchTreeNode *TreeRoot)
88 {
89 if(TreeRoot==NULL)
90 {
91 TreeRoot = malloc(sizeof(struct BinarySearchTreeNode));
92 TreeRoot -> Element = ToBeInsert;
93 TreeRoot -> Left = TreeRoot -> Right = NULL;
94 }
95 else if(ToBeInsert < TreeRoot->Element)
96 {
97 TreeRoot -> Left = BinarySearchTreeNodeInsert(ToBeInsert,TreeRoot->Left);
98 }
99 else if(ToBeInsert > TreeRoot->Element)
100 {
101 TreeRoot -> Right = BinarySearchTreeNodeInsert(ToBeInsert,TreeRoot->Right);
102 }
103 return TreeRoot;
104 }
105
106 //if doesn't find,return NULL
107 struct BinarySearchTreeNode *BinarySearchTreeNodeDelete(ElementType ToBeDelete,struct BinarySearchTreeNode *TreeRoot)
108 {
109 if(TreeRoot == NULL)
110 return NULL;
111
112 struct BinarySearchTreeNode *TmpCell;
113
114 if(ToBeDelete < TreeRoot -> Element)
115 {
116 TreeRoot -> Left = BinarySearchTreeNodeDelete(ToBeDelete,TreeRoot->Left);
117 }
118 else if(ToBeDelete > TreeRoot -> Element)
119 {
120 TreeRoot -> Right = BinarySearchTreeNodeDelete(ToBeDelete,TreeRoot->Right);
121 }
122 else //if(ToBeDelete == TreeRoot -> Element)
123 {
124 if(TreeRoot->Left && TreeRoot->Right)
125 {
126 TmpCell = BinarySearchTreeNodeFindMin(TreeRoot -> Right);
127 TreeRoot -> Element = TmpCell -> Element;
128 TreeRoot -> Right = BinarySearchTreeNodeDelete(TreeRoot->Element,TreeRoot->Right);
129 }
130 else
131 {
132 TmpCell = TreeRoot;
133 if(TreeRoot->Left==NULL)
134 {
135 TreeRoot = TreeRoot -> Right;
136 }
137 else if(TreeRoot->Right==NULL)
138 {
139 TreeRoot = TreeRoot -> Left;
140 }
141 free(TmpCell);
142 }
143 }
144 return TreeRoot;
145 }
146
147
148 int main()
149 {
150 struct BinarySearchTreeNode *TreeRoot = BinarySearchTreeInit();
151 TreeRoot = BinarySearchTreeNodeInsert(1,TreeRoot);
152 TreeRoot = BinarySearchTreeNodeInsert(2,TreeRoot);
153 TreeRoot = BinarySearchTreeNodeInsert(39,TreeRoot);
154 TreeRoot = BinarySearchTreeNodeInsert(-1,TreeRoot);
155 // TreeRoot = BinarySearchTreeNodeDelete(2,TreeRoot);
156 // TreeRoot = BinarySearchTreeNodeDelete(1,TreeRoot);
157 // TreeRoot = BinarySearchTreeNodeDelete(39,TreeRoot);
158 // FindNode = BinarySearchTreeNodeFind(2,TreeRoot);
159 // FindNode = BinarySearchTreeNodeFindMin(TreeRoot);
160 // FindNode = BinarySearchTreeNodeFindMax(TreeRoot);
161 // BinarySearchTreeDestroy(TreeRoot);
162 // printf("%d\n",TreeNodeRoot->Element);
163 return 0;
164 }