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

题意:给一棵满二叉树,叶子节点赋予权值,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:
",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;
}
原文地址:https://www.cnblogs.com/wust-ouyangli/p/4743147.html