1 #include <iostream>
2 #include <ctime>
3 using namespace std;
4
5 template<typename T>
6 struct BinaryNode
7 {
8 T element;
9 BinaryNode<T> *left;
10 BinaryNode<T> *right;
11
12 BinaryNode(const T &theElement, BinaryNode *lt, BinaryNode *rt)
13 : element(theElement), left(lt), right(rt) {}
14 };
15
16
17 template<typename T>
18 class BinarySearchTree
19 {
20 public:
21 BinarySearchTree() {
22 root = nullptr;
23 }
24 BinarySearchTree(const BinarySearchTree& rhs) { //复制构造函数
25 root = clone(rhs.root);
26 }
27 ~BinarySearchTree();
28
29 const T &findMin() const {
30 return findMin(root)->element;
31 }
32 const T &findMax() const {
33 return findMax(root)->element;
34 }
35 bool contains(const T& x) const;
36 bool isEmpty() const {
37 if (root == nullptr)
38 return true;
39 return false;
40 }
41 void printTree() const {
42 printTree(root);
43 }
44
45 void makeEmpty();
46 void insert(const T &x);
47 void remove(const T &x);
48
49 const BinarySearchTree& operator = (const BinarySearchTree& rhs);
50
51 private:
52
53 BinaryNode<T> *root; //指向树根结点的指针
54
55 void insert(const T & x, BinaryNode<T> * & t);
56 void remove(const T & x, BinaryNode<T> * & t);
57 BinaryNode<T> * findMin(BinaryNode<T> *t) const;
58 BinaryNode<T> * findMax(BinaryNode<T> *t ) const;
59 bool contains(const T & x, BinaryNode<T> *t) const;
60 void makeEmpty( BinaryNode<T> * & t );
61 void printTree( BinaryNode<T> * t ) const;
62 BinaryNode<T> * clone( BinaryNode<T> * t ) const;
63 };
64
65 template<typename T>
66 bool BinarySearchTree<T>::contains(const T& x) const
67 {
68 return contains(x, root);
69 }
70
71 template<typename T>
72 bool BinarySearchTree<T>::contains(const T & x, BinaryNode<T> *t) const
73 {
74 if (t == nullptr)
75 return false;
76 else if (x < t->element) // x 小, 说明应该在左边找
77 return contains(x, t->left);
78 else if (t->element < x) // x 大, 说明应该在右面找
79 return contains(x, t->right);
80 else
81 return true;
82 }
83
84 //findMin--返回指向树中包含最小元的结点的指针
85 template<typename T>
86 BinaryNode<T> * BinarySearchTree<T>::findMin(BinaryNode<T> *t) const
87 {
88 if (t == nullptr)
89 return nullptr;
90 if (t->left == nullptr)
91 return t;
92 return findMin(t->left);
93 }
94
95 template<typename T>
96 BinaryNode<T>* BinarySearchTree<T>::findMax(BinaryNode<T> *t) const
97 {
98 if (t != nullptr)
99 while (t->right != nullptr) {
100 t = t->right;
101 }
102 return t;
103 }
104
105 template<typename T>
106 void BinarySearchTree<T>::insert(const T &x)
107 {
108 insert(x, root);
109 }
110
111 /************************************************************************/
112 /* x is the item to insert */
113 /* t is the node that roots the subtree*/
114 /* Set the new root of the subtree*/
115 ///* 只有当一个新树叶生成时候,t才改变.
116 ///* t 是到p->left或p->right的引用.==> 意味着p->left或p->right将会改变为指向新结点.
117 /************************************************************************/
118 template<typename T>
119 void BinarySearchTree<T>::insert(const T & x, BinaryNode<T> * & t)
120 {
121 if (t == nullptr) //没有结点,在该位置处添加新结点
122 t = new BinaryNode<T>(x, nullptr, nullptr);
123 else if (x < t->element) //x 小, 在左子树查询
124 insert(x, t->left);
125 else if (t->element < x) //x 大, 在右子树查询
126 insert(x, t->right);
127 else; //Duplicate, do nothing;
128 }
129
130 template<typename T>
131 void BinarySearchTree<T>::remove(const T &x)
132 {
133 remove(x, root);
134 }
135
136 ///************************************************************************/
137 ///* x is item to remove
138 /////* t is the node that roots the subtree
139 /////* Set the new root of the subtree
140 ///* 1.结点是一片树叶时 -- 可被立即删除
141 ///* 2.结点有一个儿子, 则该结点可以在其父节点调整他的链 以绕过该结点后被删除
142 ///* 3.结点有两个儿子, 则其右子树的最小数据代替该结点的数据,并递归删除那个结点
143 ///* 注: 右子树中的最小的结点不可能有左结点
144 ///************************************************************************/
145 template<typename T>
146 void BinarySearchTree<T>::remove(const T &x, BinaryNode<T> * & t)
147 {
148 if (t == nullptr) return; //Item not found; do nothing
149 if (x < t->element) //x 小,在左子树递归查找
150 remove(x, t->left);
151 else if (t->element < x) //x 大,在右子树递归查找
152 remove(x, t->right);
153 else if (t->left != nullptr && t->right != nullptr) //two children
154 {
155 //在右子树中查找最小数据代替该结点数据.;
156 t->element = findMin(t->right)->element;
157 remove(t->element, t->right); //删除该结点
158 }
159 else //只有一个结点或是树叶. 调整它的链,以绕过该结点后被删除.
160 {
161 BinaryNode<T> *oldNode = t;
162 t = (t->left != nullptr) ? t->left : t->right;
163 delete oldNode;
164 }
165 }
166
167 /************************************************************************/
168 ///* Destructor for the tree
169 /************************************************************************/
170 template<typename T>
171 BinarySearchTree<T>::~BinarySearchTree()
172 {
173 makeEmpty();
174 }
175
176 template<typename T>
177 void BinarySearchTree<T>::makeEmpty() //公有函数
178 {
179 makeEmpty(root);
180 }
181
182 /************************************************************************/
183 ///* Internal method to make subtree empty -- 私有函数
184 /************************************************************************/
185 template<typename T>
186 void BinarySearchTree<T>::makeEmpty(BinaryNode<T> * & t)
187 {
188 if (t != nullptr)
189 {
190 makeEmpty(t->left);
191 makeEmpty(t->right);
192 delete t;
193 }
194 t = nullptr;
195 }
196
197 /************************************************************************/
198 ///* Deep copy
199 /************************************************************************/
200 template<typename T>
201 const BinarySearchTree<T>& BinarySearchTree<T>::operator = (const BinarySearchTree &rhs)
202 {
203 if (this != &rhs) {
204 makeEmpty();
205 root = clone(rhs.root);
206 }
207 return *this;
208 }
209
210 /************************************************************************/
211 ///* Internal method to clone subtree. -- 递归复制结点
212 /************************************************************************/
213 template<typename T>
214 BinaryNode<T>* BinarySearchTree<T>::clone(BinaryNode<T> * t) const
215 {
216 if (t == nullptr)
217 return nullptr;
218 return new BinaryNode<T>( t->element, clone(t->left), clone(t->right) );
219 }
220
221 /************************************************************************/
222 ///* printTree
223 /************************************************************************/
224 template<typename T>
225 void BinarySearchTree<T>::printTree(BinaryNode<T> * t) const
226 {
227
228 if (t != nullptr) {
229 cout << t->element << ' ';
230 printTree(t->left);
231 printTree(t->right);
232 }
233 }
234
235 int main()
236 {
237 srand((unsigned)time(nullptr));
238 int testData, t = 0;
239 BinarySearchTree<int> test;
240 cout << "输入数字个数: \n";
241 cin >> t;
242 cout << "输入数字: \n";
243 while (t--)
244 {
245 testData = rand() % 1000 + 1;
246 test.insert(testData);
247 }
248 cout << "\n全部元素为: \n";
249 test.printTree();
250 cout << "\nMax = " << test.findMax() << endl;
251 cout << "Min = " << test.findMin() << endl;
252 cout << "输入查找元素: \n";
253 cin >> testData;
254 cout << "是否包含 " << testData << " : " << test.contains(testData) << endl;
255 test.printTree();
256 cout << endl;
257 cout << "输入删除元素: \n";
258 cin >> testData;
259 test.remove(testData);
260 test.printTree();
261 cout << endl;
262 return 0;
263 }