题意:给出一个深度为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 }