这个题根本不用建树,因为是完全二叉树,可以把这个想成二进制。对于根是二进制数的首位,之后依次类推。到最后的叶子节点就是从0到pow(2,n)-1。
关键在于在第一次输入的不是按照x1,x2,x3,x4这样的顺序输入的,那么我们就默认他的输入时按从二进制高位到地位。对于查询是按x1,x2,x3,x4这样的顺序。所以不能直接对应,需要一些小的操作来让查询的输入和二进制对的上。
1 #include <iostream> 2 #include <cstring> 3 #include <string> 4 #include <map> 5 #include <set> 6 #include <algorithm> 7 #include <fstream> 8 #include <cstdio> 9 #include <cmath> 10 #include <stack> 11 #include <queue> 12 using namespace std; 13 const double Pi=3.14159265358979323846; 14 typedef long long ll; 15 const int MAXN=5000+5; 16 const int dx[5]={0,0,0,1,-1}; 17 const int dy[5]={1,-1,0,0,0}; 18 const int INF = 0x3f3f3f3f; 19 const int NINF = 0xc0c0c0c0; 20 const ll mod=1e9+7; 21 22 int main() 23 { 24 int n;int cn=1; 25 while(cin>>n&&n) 26 { 27 string str[10]; 28 for(int i=1;i<=n;i++) 29 cin>>str[i]; 30 string a; cin>>a;//从0开始的到pow(2,n)-1, 31 int m;cin>>m; 32 vector <char> V; 33 for(int i=1;i<=m;i++) 34 { 35 string s;cin>>s;//输入每个序列 36 int cnt=0; //在树中的位置 37 for(int i=1;i<=n;i++) 38 { 39 cnt=cnt*2+(s[str[i][1]-'0'-1]-'0'); 40 } 41 V.push_back(a[cnt]); 42 } 43 printf("S-Tree #%d:\n",cn++); 44 for(int i=0;i<V.size();i++) 45 cout <<V[i]; 46 cout <<endl<<endl; 47 } 48 return 0; 49 }