题意:给出一个深度为n的满二叉树(根节点为0层),每层都有一个变量xi,然后2^n叶子结点被赋值为0,1。然后给出m个给xi赋值的情况,遇到0就朝左孩子走,反之就右孩子,将遍历到的m个叶子结点输出来。
题解:弄清满二叉树中左孩子就是now*2,右孩子为now*2+1,其他就是模拟了。
View Code
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int main() 6 { 7 int n,ca=0; 8 while(scanf("%d",&n),n) 9 { 10 int x[10],y[10]; 11 for(int i=1;i<=n;i++) 12 { 13 char s[5]; 14 scanf("%s",s); 15 x[i]=s[1]-'0'; 16 } 17 char lef[1000],ans[1000]; 18 scanf("%s",lef); 19 int m,top=0; 20 scanf("%d",&m); 21 for(int i=0,now;i<m;i++) 22 { 23 char s[10]; 24 scanf("%s",s); 25 for(int j=0;s[j]!='\0';j++) 26 y[j+1]=s[j]-'0'; 27 now=1; 28 for(int j=1;j<=n;j++) 29 { 30 if(y[x[j]]==0) 31 now*=2; 32 else 33 now=now*2+1; 34 } 35 ans[top++]=lef[now-(1<<n)]; 36 } 37 ans[top++]='\0'; 38 printf("S-Tree #%d:\n%s\n\n",++ca,ans); 39 } 40 return 0; 41 }