二叉树的实现
1 #include<stack> 2 #include<queue> 3 #include<iostream> 4 using namespace std; 5 template<class T> 6 struct BinaryTreeNode 7 { 8 T _data; 9 BinaryTreeNode<T>* _left; 10 BinaryTreeNode<T>* _right; 11 BinaryTreeNode() : _left(NULL), _right(NULL) 12 {} 13 BinaryTreeNode(const T&x) :_data(x), _left(NULL), _right(NULL) 14 {} 15 }; 16 17 template<class T> 18 class BinaryTree 19 { 20 public: 21 BinaryTree() :_root(NULL) 22 {} 23 BinaryTree(const T*a, size_t size) 24 { 25 size_t index = 0; 26 _root = _CreateTree(a, size, index); //创建二叉树 27 } 28 BinaryTree(const BinaryTree<T>& t) 29 { 30 _root=_Copy(t._root); 31 } 32 33 void PrevOrder() //前序遍历(递归) 34 35 { 36 37 _PrevOrder(_root); 38 39 } 40 41 void PrevOrder_NonR() //前序遍历(非递归) 42 43 { 44 45 _PrevOrder_NonR(_root); 46 47 } 48 49 void InOrder() //中序遍历(递归) 50 { 51 _InOrder(_root); 52 } 53 void InOrder_NonR() //中序遍历(非递归) 54 { 55 _InOrder_NonR(_root); 56 } 57 58 void PostOrder() //后序遍历(递归) 59 60 { 61 _PostOrder(_root); 62 } 63 void PostOrder_NonR() //后序遍历(非递归) 64 { 65 _PostOrder_NonR(_root); 66 } 67 void LevelOrder() //层次遍历 68 { 69 _LevelOrder(_root); 70 } 71 72 int size() //二叉树大小 73 { 74 return _size(_root); 75 } 76 int Depth() //二叉树深度 77 { 78 return _Depth(_root); 79 } 80 int GetLeafNum() //叶子结点的个数 81 { 82 return _GetLeafNum(_root); 83 } 84 BinaryTreeNode<T>* Find(const T&x) //在二叉树查找某个数 85 { 86 return _Find(_root,x); 87 } 88 ~BinaryTree() 89 { 90 _Destory(_root); 91 _root = NULL; 92 } 93 94 protected: 95 BinaryTreeNode<T>* _CreateTree(const T*a, size_t size, size_t &index) 96 { 97 BinaryTreeNode<T>* root = NULL; 98 if (index < size&&a[index] != '#') 99 { 100 root = new BinaryTreeNode<T>(a[index]); 101 root->_left = _CreateTree(a, size, ++index); 102 root->_right = _CreateTree(a, size, ++index); 103 } 104 return root; 105 106 } 107 void _Destory(BinaryTreeNode<T>*& root) 108 { 109 if (root == NULL) 110 return; 111 if (root->_left == NULL&&root->_right == NULL) 112 { 113 delete root; 114 root = NULL; 115 return; 116 } 117 _Destory(root->_left); 118 _Destory(root->_right); 119 delete root; 120 } 121 122 void _PrevOrder(BinaryTreeNode<T> *root) 123 { 124 if (root == NULL) 125 { 126 return; 127 } 128 else 129 { 130 cout << root->_data << " "; 131 _PrevOrder(root->_left); 132 _PrevOrder(root->_right); 133 } 134 } 135 136 void _PrevOrder_NonR(BinaryTreeNode<T>* root) 137 138 { 139 140 stack<BinaryTreeNode<T>*> s; 141 142 if (root); 143 144 s.push(root); 145 146 while (!s.empty()) 147 148 { 149 150 BinaryTreeNode<T>* top = s.top(); 151 152 cout << top->_data << " "; 153 154 s.pop(); 155 156 if (top->_right) 157 158 { 159 160 s.push(top->_right); 161 162 } 163 164 if (top->_left) 165 166 { 167 168 s.push(top->_left); 169 170 } 171 172 } 173 174 cout << endl; 175 176 } 177 178 void _InOrder(BinaryTreeNode<T> *root) 179 { 180 if (root == NULL) 181 { 182 return; 183 } 184 else 185 { 186 _InOrder(root->_left); 187 cout << root->_data << " "; 188 _InOrder(root->_right); 189 } 190 } 191 192 void _InOrder_NonR(BinaryTreeNode<T> *root) 193 { 194 stack<BinaryTreeNode<T>*> s; 195 BinaryTreeNode<T>* cur = root; 196 while (!s.empty()||cur) 197 { 198 while (cur) 199 { 200 s.push(cur); 201 cur = cur->_left; 202 } 203 if(!s.empty()) 204 { 205 BinaryTreeNode<T>* top = s.top(); 206 cout << top->_data << " "; 207 s.pop(); 208 cur = top->_right; 209 } 210 } 211 } 212 213 void _PostOrder(BinaryTreeNode<T> *root) 214 215 { 216 217 if (root == NULL) 218 219 { 220 221 return; 222 223 } 224 225 else 226 227 { 228 229 _PostOrder(root->_left); 230 231 _PostOrder(root->_right); 232 233 cout << root->_data << " "; 234 235 } 236 237 } 238 239 void _PostOrder_NonR(BinaryTreeNode<T> *root) 240 241 { 242 243 stack<BinaryTreeNode<T>*> s; 244 245 BinaryTreeNode<T>* cur = root; 246 247 BinaryTreeNode<T>* prevVisted = NULL; 248 249 while (!s.empty() || cur) 250 251 { 252 253 while (cur) 254 255 { 256 257 s.push(cur); 258 259 cur = cur->_left; 260 261 } 262 263 BinaryTreeNode<T>* top = s.top(); 264 265 if (top->_right==NULL||top->_right==prevVisted) 266 267 { 268 269 cout << top->_data << " "; 270 271 prevVisted = top; 272 273 s.pop(); 274 275 } 276 277 else 278 279 { 280 281 cur = top->_right; 282 283 } 284 285 } 286 287 } 288 289 int _size(BinaryTreeNode<T>* root) 290 { 291 if (root == NULL) 292 return 0; 293 return _size(root->_left) + _size(root->_right) + 1; 294 } 295 int _Depth(BinaryTreeNode<T>* root) 296 { 297 if (root == NULL) 298 return 0; 299 int LeftDepth = _Depth(root->_left); 300 int RightDepth = _Depth(root->_left); 301 return LeftDepth>RightDepth ? LeftDepth+1 : RightDepth + 1; 302 } 303 304 int _GetLeafNum(BinaryTreeNode<T>* root) 305 { 306 if (root == NULL) 307 return 0; 308 if (root->_left == NULL&&root->_right == NULL) 309 return 1; 310 else 311 return _GetLeafNum(root->_left) + _GetLeafNum(root->_right); 312 } 313 BinaryTreeNode<T> *_Find(BinaryTreeNode<T>* root, const T&x) 314 { 315 if (root == NULL) 316 return NULL; 317 else if (root->_data == x) 318 { 319 return root; 320 } 321 else 322 { 323 BinaryTreeNode<T> *ret= _Find(root->_left, x); 324 if (ret) 325 return ret; 326 else 327 { 328 return _Find(root->_right,x); 329 } 330 } 331 } 332 333 void _LevelOrder(BinaryTreeNode<T>* root) 334 { 335 queue<BinaryTreeNode<T>*> q; 336 if (root == NULL) 337 return; 338 q.push(root); 339 while (!q.empty()) 340 { 341 BinaryTreeNode<T> *front = q.front(); 342 q.pop(); 343 cout << front->_data << " "; 344 if (front->_left) 345 { 346 q.push(front->_left); 347 } 348 if (front->_right) 349 { 350 q.push(front->_right); 351 } 352 } 353 cout<< endl; 354 } 355 BinaryTreeNode<T>* _Copy(BinaryTreeNode<T>* root) 356 { 357 if (root == NULL) 358 return NULL; 359 BinaryTreeNode<T>* newRoot=new BinaryTreeNode<T>(root->_data); 360 newRoot->_left=_Copy(root->_left); 361 newRoot->_right=_Copy(root->_right); 362 return newRoot; 363 } 364 365 BinaryTreeNode<T>& operator=(BinaryTreeNode<T>*& t) 366 367 { 368 369 if (this != &t) 370 371 { 372 373 this->_Destory(_root); 374 375 _root = _Copy(t._root); 376 377 } 378 379 return *this; 380 381 } 382 383 /*BinaryTreeNode<T>& operator=(BinaryTreeNode<T> t) 384 385 { 386 387 swap(_root, t._root); 388 389 return *this; 390 391 }*/ 392 393 protected: BinaryTreeNode<T> *_root; 394 395 }; 396 397 int main() 398 399 { 400 401 int a[10] = { 1, 2, 3, '#', '#', 4, '#','#', 5, 6 }; 402 403 BinaryTree<int> t(a, 10); 404 405 BinaryTree<int> t1(t); 406 407 BinaryTree<int> t2; 408 409 t2 = t; 410 411 cout << t.size() << endl; 412 413 cout << t.Depth() << endl; 414 415 cout << t1.size() << endl; 416 417 cout << t1.Depth() << endl; 418 419 cout << t2.size() << endl; 420 421 cout << t.Find(3)->_data << endl; 422 423 cout << t.Find(5)->_data << endl; 424 425 cout << t.Find(12) << endl; 426 427 cout<<t.GetLeafNum(); 428 429 cout<< endl; 430 431 t.InOrder(); 432 433 cout << endl; 434 435 t.InOrder_NonR(); 436 437 cout << endl; 438 439 t.PostOrder(); 440 441 cout << endl; 442 443 t.PostOrder_NonR(); 444 445 cout << endl; 446 447 t.PrevOrder(); 448 449 cout << endl; 450 451 t.PrevOrder_NonR(); 452 453 cout << endl; 454 455 t.LevelOrder(); 456 457 system("pause"); 458 459 return 0; 460 461 } 462 463