题目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 }

 

posted @ 2013-12-09 20:20  chchche  阅读(324)  评论(0编辑  收藏  举报