题意:给一棵满二叉树,叶子节点赋予权值,0或者1,对于每个查询输出叶子节点的权值,每个查询0代表往左走,1代表往右走,这题坑的地方是层的访问顺序,如第二组测试,由上到下依次是x3,x1,x2,假如给一个查询110,则从上到下的顺序是011,对应第3个叶子节点。二进制数转变成十进制数对应的叶子的权值,输出即可。
代码如下:
#include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<set> #include<map> #include<queue> #include<vector> #include<iterator> #include<utility> #include<sstream> #include<iostream> #include<cmath> #include<stack> using namespace std; const int INF=1000000007; const double eps=0.00000001; int deep; //最大深度 string L; //叶子对应的权值的字符串 int belong[10],leaf[1005],ans[1005]; //belong[]代表Xi对应第几层 void Get_Tree() { for(int i=0;i<deep;i++) { char S[4]; scanf("%s",S); int id=S[1]-‘0‘-1; //分离编号 belong[id]=i; //记录 } } void Get_Leaf() { cin>>L; //输入叶子权值 } int keep[10]; void query(int Case) { int M; cin>>M; string ret; for(int i=1;i<=M;i++) { string command; cin>>command; int len=command.length(); for(int i=0;i<len;i++) { int a=command[i]-‘0‘; keep[belong[i]]=a; //保存下来 } int id=0; for(int i=0;i<len;i++) id=id*2+keep[i]; //得到十进制数 ret+=L[id]; } printf("S-Tree #%d:\n",Case); cout<<ret<<endl; cout<<endl; } int main() { int kase=0; while(cin>>deep) { if(!deep) break; Get_Tree(); Get_Leaf(); query(++kase); } return 0; }
时间: 2024-10-29 19:11:52