欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

UVA 712-S-Trees(满二叉树的简单查询)

程序员文章站 2022-03-01 18:44:20
...

题意:给一棵满二叉树,叶子节点赋予权值,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;
}