题目1009:二叉搜索树
- 题目描述:
-
判断两序列是否为同一二叉搜索树序列
- 输入:
-
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
- 输出:
-
如果序列相同则输出YES,否则输出NO
- 样例输入:
-
2 567432 543267 576342 0
- 样例输出:
-
YES NO
1 #include <iostream> //1009 2 #include <algorithm> 3 #include <string> 4 #include <cstring> 5 #include <vector> 6 #include <cmath> 7 #include <map> 8 #include <stack> 9 #include <cstdlib> 10 11 using namespace std; 12 13 14 template<typename T> 15 class TreeNode 16 { 17 public: 18 T value; // value contained in the node 19 TreeNode<T> * parent; // Pointer to the parent 20 TreeNode<T> * left; // Pointer to the left child 21 TreeNode<T> * right; // Pointer to the right child 22 23 TreeNode() // No-arg constructor 24 { 25 left = NULL; 26 right = NULL; 27 parent = NULL; 28 } 29 30 TreeNode(T value) // Constructor 31 { 32 this->value = value; 33 left = NULL; 34 right = NULL; 35 parent = NULL; 36 } 37 }; 38 39 40 template < typename T > 41 class BinarySearchTree 42 { 43 public: 44 int treeSize; 45 string str; 46 BinarySearchTree(); 47 BinarySearchTree(T values[],int arraySize); 48 int insert(T value); 49 void inOrder(); 50 void inOrderNorRec(); 51 int deleteNode(T value); 52 int successor(T value); 53 int predecessor(T value); 54 void maxValue(); 55 void minValue(); 56 int getSize(T value); 57 void output(); 58 59 private: 60 TreeNode<T> * treeroot; 61 void inOrder(TreeNode<T> *target); 62 void inOrderNorRec(TreeNode<T> *target); 63 TreeNode<T> * search(T searchvalue); 64 int deleteNode(TreeNode<T> *delNode); 65 TreeNode<T> * successor(TreeNode<T> *target); 66 TreeNode<T> * predecessor(TreeNode<T> *target); 67 TreeNode<T> * maxValue(TreeNode<T> *target); 68 TreeNode<T> * minValue(TreeNode<T> *target); 69 int getSize(TreeNode<T> *target); 70 void output(TreeNode<T> *target,int totalSpaces); 71 void output2(TreeNode<T> *target,int totalSpaces); 72 }; 73 74 75 template < typename T > 76 BinarySearchTree<T>::BinarySearchTree() 77 { 78 treeroot = NULL; 79 treeSize = 0; 80 } 81 82 83 template < typename T > 84 BinarySearchTree<T>::BinarySearchTree(T values[],int arraySize) 85 { 86 treeroot = NULL; 87 treeSize = 0; 88 for(int i=0 ; i<arraySize ; i++){ 89 this->insert(values[i]); 90 } 91 } 92 93 94 template <typename T> 95 int BinarySearchTree<T>::insert(T value) 96 { 97 if (treeroot == NULL){ 98 treeroot = new TreeNode<T>(value); 99 } 100 else 101 { 102 TreeNode<T> *former = NULL; 103 TreeNode<T> *current = treeroot; 104 while (current != NULL){ 105 if (value < current->value){ 106 former = current; 107 current = current->left; 108 } 109 else if (value > current->value){ 110 former = current; 111 current = current->right; 112 } 113 else{ 114 cout << "Node with value "<< value <<" has existed." <<endl; 115 return 1; 116 } 117 } 118 119 if (value < former->value){ 120 TreeNode<T> *newNode=new TreeNode<T>(value); 121 former->left = newNode; 122 newNode->parent = former; 123 } 124 else if(value > former->value){ 125 TreeNode<T> *newNode=new TreeNode<T>(value); 126 former->right = newNode; 127 newNode->parent = former; 128 } 129 } 130 131 treeSize++; 132 return 0; 133 } 134 135 136 template <typename T> 137 TreeNode<T> * BinarySearchTree<T>::search(T searchvalue) 138 { 139 TreeNode<T> *current = treeroot; 140 int find =0; 141 while (current != NULL && find == 0){ 142 if (current->value == searchvalue){ 143 find = 1; 144 } 145 else if(current->value > searchvalue){ 146 current = current->left; 147 }else{ 148 current = current->right; 149 } 150 } 151 152 if (find == 1){ 153 return current; 154 }else{ 155 return NULL; 156 } 157 } 158 159 160 template <typename T> 161 int BinarySearchTree<T>::deleteNode(T value){ 162 TreeNode<T> *delNode = this->search(value); 163 if ( delNode == NULL){ 164 cout << "not find " << endl; 165 return 1; 166 } 167 this->deleteNode(delNode); 168 cout << "Node "<< value <<" has been deleted."<< endl; 169 return 0; 170 } 171 172 173 template <typename T> 174 int BinarySearchTree<T>::deleteNode(TreeNode<T> *delNode){ 175 TreeNode<T> *deleteTarget; 176 if (delNode->left == NULL && delNode->right == NULL){ 177 deleteTarget = delNode; 178 }else if(delNode->left !=NULL){ 179 deleteTarget = this->predecessor(delNode); 180 }else if(delNode->right !=NULL){ 181 deleteTarget = this->successor(delNode); 182 } 183 184 TreeNode<T> *deleteTargetChild = NULL; 185 if (deleteTarget->left != NULL){ 186 deleteTargetChild = deleteTarget->left; 187 }else if (deleteTarget->right != NULL){ 188 deleteTargetChild = deleteTarget->right; 189 } 190 191 if (deleteTargetChild != NULL){ 192 deleteTargetChild->parent = deleteTarget->parent; 193 } 194 195 if (deleteTarget->parent == NULL){ 196 treeroot = deleteTargetChild; 197 deleteTargetChild->parent = NULL; 198 }else if ( deleteTarget->parent->left == deleteTarget){ 199 deleteTarget->parent->left = deleteTargetChild; 200 }else{ 201 deleteTarget->parent->right = deleteTargetChild; 202 } 203 204 if (deleteTarget != delNode){ 205 delNode->value = deleteTarget->value; 206 } 207 208 treeSize--; 209 return 0; 210 } 211 212 213 template <typename T> 214 int BinarySearchTree<T>::successor(T value) 215 { 216 TreeNode<T> *position = this->search(value); 217 if ( position == NULL){ 218 cout << "not find " << endl; 219 return 1; 220 } 221 TreeNode<T> *successorNode = this->successor(position); 222 if ( successorNode != NULL) 223 cout << value << " \'s successor is:" << successorNode->value << endl; 224 else 225 cout << value << " has no successor" << endl; 226 return 0; 227 } 228 229 230 template <typename T> 231 TreeNode<T> * BinarySearchTree<T>::successor(TreeNode<T> *target) 232 { 233 if ( target->right != NULL){ 234 return minValue(target->right); 235 } 236 TreeNode<T> * parentNode =target->parent; 237 while ( parentNode != NULL && parentNode->right == target){ 238 target = parentNode; 239 parentNode = parentNode->parent; 240 } 241 return parentNode; 242 } 243 244 245 template <typename T> 246 int BinarySearchTree<T>::predecessor(T value) 247 { 248 TreeNode<T> *position = this->search(value); 249 if ( position == NULL){ 250 cout << "not find " << endl; 251 return 1; 252 } 253 TreeNode<T> *predecessorNode = this->predecessor(position); 254 if ( predecessorNode != NULL) 255 cout << value << " \'s predecessor is:" << predecessorNode->value << endl; 256 else 257 cout << value << " has no predecessor" << endl; 258 return 0; 259 } 260 261 262 template <typename T> 263 TreeNode<T> * BinarySearchTree<T>::predecessor(TreeNode<T> *target) 264 { 265 if ( target->left != NULL){ 266 return maxValue(target->left); 267 } 268 TreeNode<T> * parentNode =target->parent; 269 while ( parentNode != NULL && parentNode->left == target){ 270 target = parentNode; 271 parentNode = parentNode->parent; 272 } 273 return parentNode; 274 } 275 276 277 template <typename T> 278 void BinarySearchTree<T>::maxValue() 279 { 280 TreeNode<T> * max = this->maxValue(treeroot); 281 cout << "Max Value is :" << max->value << endl; 282 } 283 284 285 template <typename T> 286 TreeNode<T> * BinarySearchTree<T>::maxValue(TreeNode<T> *target) 287 { 288 while (target -> right != NULL){ 289 target = target -> right; 290 } 291 return target; 292 } 293 294 295 template <typename T> 296 void BinarySearchTree<T>::minValue() 297 { 298 TreeNode<T> * min = this->minValue(treeroot); 299 cout << "Min Value is :" << min->value << endl; 300 } 301 302 303 template <typename T> 304 TreeNode<T> * BinarySearchTree<T>::minValue(TreeNode<T> *target) 305 { 306 while (target -> left != NULL){ 307 target = target -> left; 308 } 309 return target; 310 } 311 312 313 template <typename T> 314 int BinarySearchTree<T>::getSize(T value) 315 { 316 TreeNode<T> *target = this->search(value); 317 return getSize(target); 318 } 319 320 321 template <typename T> 322 int BinarySearchTree<T>::getSize(TreeNode<T> *target) 323 { 324 if (target == NULL){ 325 return 0; 326 } 327 328 if (target->left == NULL && target->left == NULL){ 329 return 1; 330 }else { 331 return this->getSize(target->left) + 1 + this->getSize(target->right); 332 } 333 } 334 335 336 template <typename T> 337 void BinarySearchTree<T>::inOrder() 338 { 339 inOrder(treeroot); 340 } 341 342 343 template <typename T> 344 void BinarySearchTree<T>::inOrder(TreeNode<T> *target) 345 { 346 if (target == NULL) 347 return ; 348 inOrder(target->left); 349 cout << target->value << " "; 350 inOrder(target->right); 351 } 352 353 354 template <typename T> 355 void BinarySearchTree<T>::inOrderNorRec() 356 { 357 inOrderNorRec(treeroot); 358 } 359 360 361 template <typename T> 362 void BinarySearchTree<T>::inOrderNorRec(TreeNode<T> *target) 363 { 364 stack < TreeNode<T> *> s; 365 while ((target != NULL) || !s.empty()) 366 { 367 if (target != NULL) 368 { 369 s.push(target); 370 target = target->left; 371 } 372 else 373 { 374 target = s.top(); 375 cout << target->value << " "; 376 s.pop(); 377 target = target->right; 378 } 379 } 380 } 381 382 383 template <typename T> 384 void BinarySearchTree<T>::output() 385 { 386 output2(treeroot,0); 387 } 388 389 390 template <typename T> 391 void BinarySearchTree<T>::output(TreeNode<T> *target,int totalSpaces) 392 { 393 if(target != NULL) 394 { 395 output(target->right,totalSpaces+4); 396 for(int i=0;i<totalSpaces;i++){ 397 cout<<' '; 398 } 399 400 if (target->parent != NULL){ 401 cout << target->value << "[" << target->parent->value << "]" << endl; 402 } 403 else{ 404 cout << target->value << "[ROOT]" << endl; 405 } 406 407 output(target->left,totalSpaces+4); 408 } 409 }; 410 411 412 413 template <typename T> 414 void BinarySearchTree<T>::output2(TreeNode<T> *target,int totalSpaces) 415 { 416 if(target != NULL) 417 { 418 output2(target->right,totalSpaces+4); 419 output2(target->left,totalSpaces+4); 420 if (target->parent != NULL) 421 { 422 str+=((char)target->value); 423 } 424 else 425 { 426 str+=((char)target->value); 427 } 428 429 } 430 431 }; 432 433 int main() 434 { 435 436 int n; 437 char s[20]; 438 int arr[20]; 439 int i; 440 int j; 441 vector< BinarySearchTree<int> > tree; 442 443 while(cin >> n) 444 { 445 n++; 446 for(i = 0; i < n; i++) 447 { 448 memset(s,0,sizeof(s)); 449 memset(arr,0,sizeof(arr)); 450 cin >> s; 451 for(j = 0; j < strlen(s); j++) 452 { 453 arr[j] = s[j] - '0'; 454 } 455 BinarySearchTree <int> t(arr,strlen(s)); 456 tree.push_back(t); 457 } 458 459 tree[0].output(); 460 461 for(j = 1; j < tree.size(); j++) 462 { 463 tree[j].output(); 464 if(tree[j].str == tree[0].str) 465 cout<<"YES"<<endl; 466 else 467 cout<<"NO"<<endl; 468 } 469 tree.clear(); 470 } 471 472 return 0; 473 }