http://www.patest.cn/contests/pat-a-practise/1043
1 #include <stdio.h> 2 #include <vector> 3 using namespace std; 4 5 struct Node 6 { 7 Node* lchild; 8 Node* rchild; 9 int val; 10 }Tree[2000]; 11 12 int loc,loc2,loc3; 13 Node* create() 14 { 15 Tree[loc].lchild=NULL; 16 Tree[loc].rchild=NULL; 17 return &Tree[loc++]; 18 } 19 20 Node* insert1(Node* T,int v)//二叉排序树构建 21 { 22 if(T==NULL) 23 { 24 T=create(); 25 T->val=v; 26 } 27 else 28 { 29 if(v<T->val) T->lchild=insert1(T->lchild,v); 30 else T->rchild=insert1(T->rchild,v); 31 } 32 return T; 33 } 34 35 Node* insert2(Node* T,int v)//镜像二叉排序树构建 36 { 37 if(T==NULL) 38 { 39 T=create(); 40 T->val=v; 41 } 42 else 43 { 44 if(v>=T->val) T->lchild=insert2(T->lchild,v); 45 else T->rchild=insert2(T->rchild,v); 46 } 47 48 return T; 49 } 50 51 52 53 void preorder(Node *T,int ans[]) 54 { 55 56 if(T!=NULL) 57 { 58 ans[loc2++]=T->val; 59 if(T->lchild!=NULL) preorder(T->lchild,ans); 60 if(T->rchild!=NULL) preorder(T->rchild,ans); 61 } 62 } 63 64 void postorder(Node* T,int ans[]) 65 { 66 if(T!=NULL) 67 { 68 if(T->lchild!=NULL) postorder(T->lchild,ans); 69 if(T->rchild!=NULL) postorder(T->rchild,ans); 70 ans[loc3++]=T->val; 71 } 72 } 73 74 75 bool compare(int a[],int b[],int n)//比较序列 76 { 77 bool bo=true; 78 for(int i=0;i<n;i++) 79 { 80 if(a[i]!=b[i]) 81 { 82 bo=false;break; 83 } 84 } 85 86 return bo; 87 } 88 89 90 91 int main() 92 { 93 int n,i; 94 //二叉排序树的前序就是构建树的插入顺序 95 //所以只要按照前序建立二叉排序树 和 镜像二叉排序树,得出两者的前序 96 //与输入的序列比较,如果其中之一相等,则YES,并输出该树的中序。否则,NO。 97 while(scanf("%d",&n)!=EOF) 98 { 99 getchar(); 100 int v1[1000];//存储 输入序列 101 int pre1[1000];//存储 二叉排序树的前序 102 int pre2[1000];//存储 镜像二叉排序树的前序 103 int post[1000];//存储 后序遍历 104 loc=0; loc3=0; 105 Node *T1=NULL,*T2=NULL; 106 for(i=0;i<n;i++)//建树 107 { 108 scanf("%d",&v1[i]); 109 T1=insert1(T1,v1[i]); 110 T2=insert2(T2,v1[i]); 111 } 112 getchar(); 113 loc2=0; 114 preorder(T1,pre1); 115 loc2=0; 116 preorder(T2,pre2); 117 bool b1=compare(v1,pre1,n),b2=compare(v1,pre2,n); 118 119 if(!b1&&!b2) 120 { 121 printf("NO "); 122 } 123 else 124 { 125 printf("YES "); 126 if(b1) postorder(T1,post); 127 else postorder(T2,post); 128 129 for(i=0;i<n;i++) 130 printf("%d%c",post[i],i==n-1?' ':' '); 131 } 132 } 133 return 0; 134 }