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:\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

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

UVA 712(二叉树模拟)

L - S-Trees Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Appoint description:  System Crawler  (2014-04-01) Description  S-Trees  A Strange Tree (S-tree) over the variable set  is a binary tree representing a B

[Swift]LeetCode894. 所有可能的满二叉树 | All Possible Full Binary Trees

A full binary tree is a binary tree where each node has exactly 0 or 2 children. Return a list of all possible full binary trees with N nodes.  Each element of the answer is the root node of one possible tree. Each node of each tree in the answer mus

S-Tree (UVa 712) 二叉树

题目:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=839&page=show_problem&problem=653 思路:当前结点为k,左走则 2k,右走则 2k + 1,得到最后的点,减去前面n层的所有结点,得到的下标对应的0或1就是答案. /* S-Tree (UVa 712) */ #include <iostream> #include &

leetcode 894. 所有可能的满二叉树(All Possible Full Binary Trees)

题目 满二叉树是一类二叉树,其中每个结点恰好有 0 或 2 个子结点. 返回包含 N 个结点的所有可能满二叉树的列表. 答案的每个元素都是一个可能树的根结点. 答案中每个树的每个结点都必须有 node.val=0. 你可以按任何顺序返回树的最终列表. 示例: 输入:7输出:[[0,0,0,null,null,0,0,null,null,0,0],[0,0,0,null,null,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,null,null,null,null,0,0

二叉树、平衡二叉树、完全二叉树、满二叉树 .

基本概念 结点的层次(Level)从根开始定义,根为第一层,根的孩子为第二层. 二叉树的高度:树中结点的最大层次称为树的深度(Depth)或高度. 二叉树 在计算机科学中,二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用作二叉查找树和二叉堆.二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒.二叉树的第i层至多有2的(i

完全二叉树 满二叉树

概念 结点的层次(Level)从根开始定义,根为第一层,根的孩子为第二层. 二叉树的高度:树中结点的最大层次称为树的深度(Depth)或高度. 数据结构中,树的度是什么?  它是树内各结点的度的最大值. 为何节点的度? 结点拥有的子树数称为结点的度. 二叉树 在计算机科学中,二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用作二叉查找树和二叉堆.二叉树的每个结点至多

树、二叉树、满二叉树、完全二叉树

自由树 自由树是一个连通的,无回路的无向图. 令G=(V,E)为一个无向图.下面的表述是等价的. 1)        G是自由树. 2)        G中任意两个顶点由唯一一条简单路径得到. 3)        G是连通的,但从E中去掉任何边后得到的图都是非连通的. 4)        G是无回路的,且|E|=|V|-1. 5)        G是连通的,且|E|=|V|-1. 6)        G是无回路的,但添加任何边到E中得到的图包含回路. 二叉树 在计算机科学中,二叉树是每个节点最多

数据结构与算法(八)-二叉树(斜二叉树、满二叉树、完全二叉树、线索二叉树)

前言:前面了解了树的概念和基本的存储结构类型及树的分类,而在树中应用最广泛的种类是二叉树 一.简介 在树型结构中,如果每个父节点只有两个子节点,那么这样的树被称为二叉树(Binary tree).其中,一个父结点的两个字节点分别叫做“左子节点”和“右子节点”.不过也不是所有父节点都有两个子节点,只有左子节点或者只有右子节点的情况也存在.另外,也会存在叶子结点,也就是一个子节点都没有的节点,唯一的限制就是每一个节点的子节点不能超过两个. 之前谈过的单向链表,是一种通过“指向下一个元素的指针”来连接

代码赏析——满二叉树

/* 标题:锦标赛 如果要在n个数据中挑选出第一大和第二大的数据 (要求输出数据所在位置和值) 使用什么方法比较的次数最少? 我们可以从体育锦标赛中受到启发. 8个选手的锦标赛,先两两捉对比拼,淘汰一半. 优胜者再两两比拼...直到决出第一名. 第一名输出后,只要对黄色标示的位置重新比赛即可. 下面的代码实现了这个算法(假设数据中没有相同值). 代码中需要用一个数组来表示图中的树 (注意,这是个满二叉树,不足需要补齐). 它不是存储数据本身,而是存储了数据的下标. 第一个数据输出后,它所在的位置