二叉搜索树
1 #include<iostream> 2 using namespace std; 3 template<class K,class V> 4 struct BSTNode 5 { 6 K _key; 7 V _value; 8 BSTNode<K, V> *_left; 9 BSTNode<K, V> *_right; 10 BSTNode(const K&key,const V&value) 11 :_key(key), _value(value), _left(NULL), _right(NULL) 12 {} 13 }; 14 15 template<class K, class V> 16 class BSTree 17 { 18 typedef BSTNode<K, V> Node; 19 protected: 20 Node* _root; 21 public: 22 BSTree() :_root(NULL) 23 {} 24 ~BSTree() 25 {} 26 void Inorder() 27 { 28 return _Inorder(_root); 29 cout << endl; 30 } 31 bool Insert(const K&key, const V&value) 32 { 33 if (_root == NULL) 34 { 35 _root = new Node(key, value); 36 return true; 37 } 38 Node *parent = NULL; 39 Node *cur = _root; 40 while (cur) 41 { 42 if (cur->_key < key) 43 { 44 parent = cur; 45 cur = cur->_right; 46 } 47 else if (cur->_key > key) 48 { 49 parent = cur; 50 cur = cur->_left; 51 } 52 else 53 { 54 return false; 55 } 56 57 if (parent->_key < key) 58 { 59 parent->_right = new Node(key, value); 60 } 61 else 62 { 63 parent->_left = new Node(key, value); 64 } 65 return true; 66 } 67 } 68 69 70 Node* Find(const K&key) 71 { 72 Node*cur = _root; 73 while (cur) 74 { 75 if (cur->_key > key) 76 { 77 cur = cur->_left; 78 } 79 else if (cur->_key < key) 80 { 81 cur = cur->_right; 82 } 83 else 84 { 85 return cur; 86 } 87 } 88 return NULL; 89 } 90 bool Insert_R(const K&key, const V&value) 91 { 92 return _Insert_R(_root, key, value); 93 } 94 95 Node* Find_R(const K&key) 96 { 97 return _Find_R(_root, key); 98 } 99 100 bool Remove_R(const K&key) 101 { 102 return _Remove_R(_root, key); 103 } 104 105 bool Remove(const K&key)//非递归删除 106 { 107 return _Remove(_root, key); 108 } 109 110 protected: 111 bool _Insert_R(Node*&root, const K&key, const V&value) 112 { 113 if (root == NULL) 114 { 115 root = new Node(key, value); 116 return true; 117 } 118 if (root->_key < key) 119 { 120 return _Insert_R(root->_right, key, value); 121 } 122 if (root->_key > key) 123 { 124 return _Insert_R(root->_left, key, value); 125 } 126 else 127 { 128 return false; 129 } 130 } 131 132 Node* _Find_R(Node*&root, const K&key) 133 { 134 if (root == NULL) 135 { 136 return NULL; 137 } 138 if (root->_key < key) 139 { 140 return _Find_R(root->_right, key); 141 } 142 else if (root->_key>key) 143 { 144 return _Find_R(root->_left, key); 145 } 146 else 147 { 148 return root; 149 } 150 } 151 152 bool _Remove_R(Node*& root, const K&key) 153 { 154 if (root == NULL) 155 { 156 return false; 157 } 158 else if (root->_key < key) 159 { 160 return _Remove_R(root->_right, key); 161 } 162 else if (root->_key > key) 163 { 164 return _Remove_R(root->_left, key); 165 } 166 else 167 { 168 Node* del = root; 169 if (root->_left == NULL) 170 { 171 root = root->_right; 172 } 173 else if (root->_right == NULL) 174 { 175 root = root->_left; 176 } 177 else 178 { 179 Node* firstInorder = root->_right; 180 while (firstInorder->_left) 181 { 182 firstInorder = firstInorder->_left; 183 } 184 swap(del->_key, firstInorder->_key); 185 swap(del->_value, firstInorder->_value); 186 return _Remove_R(root->_right, key); 187 } 188 delete del; 189 } 190 } 191 192 bool _Remove(Node*& root, const K&key) //非递归删除 193 { 194 if (root == NULL) 195 { 196 return false; 197 } 198 if (root->_left == NULL&&root->_right == NULL) 199 { 200 delete root; 201 root = NULL; 202 return true; 203 } 204 Node* parent = NULL; 205 Node* del = root; 206 while (del) 207 { 208 if (del->_key < key) 209 { 210 parent = del; 211 del = del->_right; 212 } 213 else if (del->_key > key) 214 { 215 parent = del; 216 del = del->_left; 217 } 218 else 219 { 220 break; 221 } 222 } 223 if (del) 224 { 225 if (del->_left == NULL) 226 { 227 if (del == root) 228 { 229 root = del->_right; 230 } 231 else 232 { 233 if (del == parent->_left) 234 { 235 parent->_left = del->_right; 236 } 237 else 238 { 239 parent->_right = del->_right; 240 } 241 } 242 } 243 else if (del->_right == NULL) 244 { 245 if (del == root) 246 { 247 root = del->_left; 248 } 249 else 250 { 251 if (del == parent->_left) 252 { 253 parent->_left = del->_left; 254 } 255 else 256 { 257 parent->_right = del->_left; 258 } 259 } 260 } 261 else 262 { 263 Node* parent = del; 264 Node* firstInorder = del->_right; 265 while (firstInorder->_left) 266 { 267 parent = firstInorder; 268 firstInorder = firstInorder->_left; 269 } 270 swap(del->_key, firstInorder->_key); 271 swap(del->_value, firstInorder->_value); 272 if (firstInorder == parent->_left) 273 { 274 parent->_left = firstInorder->_right; 275 } 276 else 277 { 278 parent->_right = firstInorder->_right; 279 } 280 delete del; 281 del = NULL; 282 return true; 283 } 284 } 285 } 286 287 void _Inorder(Node* root) 288 { 289 if (root == NULL) 290 { 291 return; 292 } 293 else 294 { 295 _Inorder(root->_left); 296 cout << root->_key << " "; 297 _Inorder(root->_right); 298 } 299 } 300 }; 301 void Test() 302 { 303 int a[] = { 5, 3, 4, 1, 7, 8, 2, 6, 0, 9 }; 304 BSTree<int, double> t; 305 for (size_t i = 0; i < sizeof(a) / sizeof(int);++i) 306 { 307 t.Insert_R(a[i], a[i]); 308 } 309 t.Inorder(); 310 cout << endl; 311 cout<<t.Find(4); 312 cout << endl; 313 //t.Remove(4); 314 t.Remove(2); 315 /*t.Remove_R(1); 316 t.Remove_R(5);*/ 317 318 t.Inorder(); 319 cout << endl; 320 }