UVA-712-二叉树

一个策略树(S-tree)是一组变量Xn={x1,x2...xn}的表现形式,
它代表一个布尔函数f:{0,1}n->{0,1},策略树每条路径从根结点开始由n+1个结点组成,
策略树的每一个结点都有一个深度,
结点的深度等于当前结点到根结点之间的结点总和(根节点的深度等于0),
结点深度小于n的结点叫做非终止结点,所有的非终止结点都有俩个孩子,左孩子和右孩子,
每个非终止结点被xi标志(xi来自Xn集合),
所有深度一样的非终止结点被一样的xi标志,
所有深度不一样的非终止结点被不一样的xi标志,所以根结点由独特的xi1变量标志,
独特的xi2变量标志深度等于1的结点,一直下去.xi1,xi2....xin叫做变量顺序,
请注意,变量顺序和分布在终止结点上的0和1有效的描述了一颗策略树.

在先前的说明中,每一颗策略树代表了一个布尔函数f,如果你有一颗策略树和变量x1....xn的值,你可以非常简单的算出f(x1....xn)的结果
计算方法如下
从根结点开始,重复使用一下方法:如果结点标记为xi,这个变量的值是0还是1决定你是往左孩子走还是右孩子走,
一旦你到达一个终止结点,当前的函数值就等于当前的终止结点的值

在图片里,俩个策略树代表相同的布尔函数f(x1,x2,x3)=x1^(x2vx3),正如我们展示的那样,左边的变量顺序是x1,x2,x3,右边的是x3,x1,x2
变量x1.....xn的值,如下声明变量的值(VVA)
(x1=b1,x2=b2.......xn=bn)
b1,b2....属于{0,1},我们如下给变量赋值
(x1=1,x2=1,x3=0)是一个合法的VVA,此时n=3,这样将产生同样的函数f(1,1,0)=1^(1 v 0),在图中用粗黑线描出,注意,0往左走,1往右走

你的任务是写一个程序,拿到一颗策略树和VVA,计算f(x1,x2.....xn)

输入

输入文件的组成描述了几组策略树和相关联的VVA,每一个描述第一行由一个单独的int值n组成,1<=n<=7,代表当前策略树的深度,
随下来的行描述策略树的变量顺序,格式:xi1.....xin(由空格隔开的不同的明确的n),
所以,假如n=3,变量顺序x3,x1,x2,这行就像下面那样
x3 x1 x2
下一行由0和1组成代表终止结点,明确的2^n个字符(每一个要么是0要么是1),最左边是最左结点,最右是最右结点(注意,策略树是满二叉树,第n层有2^n个结点)
下一行由一个单独的int类型m组成,代表VVA的数量,在随下来的m行描述它们,每一行包含n个(0或1)字符,
不管策略树的变量顺序,第一个字符总是描述x1,第二个字符描述x2,所以如下面的行

110
组成VVA(x1=1,x2=1,x3=0)
输入结束标志n=0

输出

对每一个策略树,输出一行"S-Tree #j:",j是策略树的序号,然后输出一行,对给定的m个VVA,输出f(x1....xn)的值

时间: 2024-10-11 11:47:06

UVA-712-二叉树的相关文章

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

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 &

UVa 712 - S-Trees

题目:给你一棵全然二叉树,再给你一个xi1~xin-1的序列,相应从根到叶子上一层. 每层相应一个xi,叶子是0或1,如今给你一些路径,输出路径相应的叶子的值: 路径是01串.从更開始往下走,0表示左子树,1表示右子树,相应x1~xn-1的顺序. 分析:模拟. 直接安找路径走过去就好了,由于是二叉树,正好相应二进制数. 注意:路径的顺序要调整到和树一样在计算. #include <algorithm> #include <iostream> #include <cstdlib

UVa 548 (二叉树的递归遍历) Tree

题意: 给出一棵由中序遍历和后序遍历确定的点带权的二叉树.然后找出一个根节点到叶子节点权值之和最小(如果相等选叶子节点权值最小的),输出最佳方案的叶子节点的权值. 二叉树有三种递归的遍历方式: 先序遍历,先父节点  然后左孩子  最后右孩子 中序遍历,先左孩子  然后父节点  最后父节点 后序遍历,先左孩子  然后右孩子  最后父节点 这里有更详细的解释: http://blog.csdn.net/sicofield/article/details/9066987 紫书上面写错了,后序遍历最后一

UVa 699 (二叉树) The Falling Leaves

题意: 按先序方式输入一棵二叉树,节点是带权的,左孩子在父节点的左一个单位,右孩子在父节点的右一个单位,从左到右输出相同水平位置节点之和. 分析: 做了好几道二叉树的题,代码应该也很好理解了.这里maxn开始设了200.500都RE,后来索性开了2000,AC了 紫书上面init函数最后应该加一句 return true; 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstri

uva 548(二叉树)

题解:给出了二叉树的中序和后序.重建二叉树.输出路径和最短的叶子的值. 两个模板: 给出前序和中序建树: Node* build (int n, int* preo, int* ino) { Node* node = new Node; int i = 0; if (n <= 0) return NULL; while (ino[i] != preo[0]) i++; node -> val = ino[i]; node -> left = build(i, preo + 1, ino)

uva 11234(二叉树、线性表)

题解:可以根据输入的字符串画一个二叉树出来,然后层次遍历一下就和输出结果顺序一样,所以根据输入把大写字母当做两个小写字母的根节点,将节点即运算结果当做另一个小写字母放进栈里,和另一个字母组建生成新的树放进栈里,直到最后的的根节点也放进了栈里,开始层次遍历,用数组模拟队列进行遍历,注意因为结果的顺序是从右到左,所以注意遍历的方向问题. #include <cstdio> #include <stack> #include <queue> #include <cstd

UVA 679 二叉树

题目链接:https://vjudge.net/problem/UVA-679 参考自:刘汝佳的紫书 思路: 我们发现,对于每一颗子树,假如小球是第奇数次到达这颗子树的根节点时,那么此时应该向左子树走,如果是偶数次,则向右子树方向走,假如现在给出了一组输入depth,num,即深度为depth的二叉树,求第num个小球落到的位置,那么我们发现,对于每一颗子树来说,假如现在是第num次到达这颗树的根节点,如果num为奇数,那么它应该向左子树方向走,并且是第(num+1)/2次到达左子树的根节点,如

UVA - 712 S-Trees(S树)

题意:0往左走,1往右走,已知所有叶子的值,每个查询都是根结点到叶子结点的路径,路径的每一个点分别对应着x1,x2,x3--但是实际上的S树的路径可能并非是x1,x2,x3-- 分析:先存路径变量的顺序,来控制最后访问的顺序. #pragma comment(linker, "/STACK:102400000, 102400000") #include<cstdio> #include<cstring> #include<cstdlib> #incl

UVa 712 S树

题意:有一棵完全二叉树,每层元素有同一变量表示,从上到下分别为x1,x2,... 最后一层叶子结点会有0或1的赋值,输入给出.然后如果xi取值为0时,则往左子树走,否则往右子树走,直到走到叶子结点,得到一值. 思路:因为是完全二叉树,可以用顺序存储,数组实现即可.另外也只需存叶子结点的值就行了.对一结点k来说,左孩子是2k,右孩子是2k+1.因为高度最大为7,最多有x7,所以可以直接取数组的第二位,即下标1,来获得xk中的k. 注意:每个测试样例后有个空行,WA了一次~ 二维数组作形参: 一是