这题关键是 反转 查询是固定按照x1x2x3来的 那么先收集前面的顺序 然后在数组里面直接调用即可
比如前面的树是 x3 x1 x2 就把这个当作数组下标
最左边的树是 1<<n
左结点 2k 右节点 2k+1
#include<iostream> #include<string> using namespace std; const int maxn = 10; int n, v[maxn];//映射表 string leaves; int solve(const string& q) { int u = 1; for(int i = 0; i < n; i++) { if(q[v[i]] == '0') u *= 2; else u = u*2+1; } return leaves[u-(1<<n)] - '0'; } int main() { int kase = 0; while(cin >> n && n) { string s; cout << "S-Tree #" << ++kase << ": "; for(int i = 0; i < n; i++) { cin >> s; v[i] = s[1] - '1'; } int m; cin >> leaves >> m; while(m--) { string q; cin >> q; cout << solve(q); } cout << " "; } return 0; }