题意:给定一个数字,以及一个描写叙述树的字符序列,问存不存在一条从根到某叶子结点的路径使得其和等于那个数。

难点在于怎样处理字符序列。由于字符间可能有空格、换行等。

思路:本来想着用scanf的(后发现scanf貌似不能做)。感觉太麻烦。想看网上有没有处理比較好的,一搜全是用C++的cin流的~  还是自己用C写了一下。

用的getchar()。getchar()主要就是比較繁琐。须要一个一个字符比較,记得刚開始做字符串题目时比較喜欢用getchar(),有的用scanf即可的自己也喜欢用getchar();好久没用了,写之前认为有些麻烦。

。纠结了一下~ 还是不要嫌麻烦啊。

这里还是避免了动态内存分配及释放这个易出错的东西,用一个先申请了的大Node数组anode,以及cnt记录已使用的anode的最大下标。

相同,当中用栈来匹配时,入栈和出栈的都是对应结点在anode数组中的下标值。(已经用这种方法连续做几道题了,走火入魔了~)

处理树的录入的情况是,每读一个字符分三种情况:左括号、数字、右括号,及其它忽略。

读入左括号时,若之前是在读数字(dsz为1)。则数字结束。转为int型。初始化一个Node结点。在结点入栈前,若栈非空。则该结点是栈顶元素的左或右孩子(通过结构体的lv域推断左孩子是否已赋值)。

读入数字时,非常easy,主要注意负数的情况。读入右括号时,假设上一次是读的左括号(zkh为1),则说明读的是一个空括号,这种情况下假设栈为空。则是读入了一个空树的特殊情形,若栈非空,则将栈顶元素的左或右孩子置为空,相同通过lv域来推断左右;假设读到的不是空括号,则相应栈顶元素的左右孩子均已赋值。出栈。

这样就可以建树。

只是能够发现和值在建树过程中就可以计算,仅仅要维护一个值。它是栈中元素的值之和就可以。(程序中的he值)每到叶子结点时,通过与给定的值推断。另外还需注意的就是如何跳出读取树描写叙述符字节序列的这个while循环。

这里用栈为空的时候。只是有几个特殊情况又须要fg变量进行标记,比方第一个为空格字符top本来就为0但不应跳出,比方读到空树时尽管没有数字入栈过但应该要跳出了所以置fg为1。

注意:值可为负数。(这个网搜的时候看别人提到,不知道自己会不会注意到)

本地调了几次,一次就AC了还是不错的。没有什么大错误,注意到一个数字读完后把计数置0即可了。UVa 365名还能够

Code:

#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#define MAXN 1000 typedef struct node
{
int data;
int left,right;
bool lv;//左孩子是否已赋值
bool lnull;//左孩子是否为空
}Node; Node anode[MAXN];
int cnt=0;//已经用的Node的最大下标。 位置0不用,代表空节点。 int main()
{
int sum=0;
while(scanf("%d",&sum)==1)
{//读一行
char c;
bool zkh=0;
char num[15]; int x=0;
bool dsz=0;
int stack[MAXN]; int top=0;//top始终指向栈顶元素,位置0不用,代表空栈
int he=0;//树的和值,当前栈内元素的和值。
bool flag=0;
cnt=0;
bool fg=0;
while((c=getchar()))
{//读树形式
if(c=='(')
{
if(dsz)
{
num[x]='\0';
x=0; //注意这里一个数字输入结束后需置零下标位
int nmb=atoi(num);
//构造新结点
anode[++cnt].data=nmb;
anode[cnt].left=anode[cnt].right=0;
anode[cnt].lv=0;
anode[cnt].lnull=0;
//入栈
fg=1;//证明曾有数字入栈过
if(top)
{//若栈非空,则当前元素是栈顶元素的左或右孩子
if(anode[stack[top]].lv==0) {anode[stack[top]].left=cnt; anode[stack[top]].lv=1;}
else anode[stack[top]].right=cnt;
}
he=he+nmb;
stack[++top]=cnt;
}
dsz=0;
zkh=1;
}
else if(c=='-'||isdigit(c))
{
num[x++]=c;
dsz=1;
zkh=0;
}
else if(c==')')
{
if(zkh)//读到空括号()
{
if(top)
{
if(anode[stack[top]].lv==0) {anode[stack[top]].left=0; anode[stack[top]].lv=1; anode[stack[top]].lnull=1;}
else {anode[stack[top]].right=0; if(anode[stack[top]].lnull&&he==sum) {flag=1; } }//若左右孩子均为空,则为叶子结点,则可比較和值。 这里flag=1后还是不要break比較好,由于匹配栈到空时才退出循环,不然不好推断后面的输入字符到什么时候结束,不能用换行推断。
}
else//读到空括号()且栈为空,则是空树。 并把fg置1可跳出循环
{ flag=0; fg=1;}
}
else
{//出栈
he=he-anode[stack[top]].data;
top--;
}
dsz=0;
zkh=0;
}
if(fg&&(top==0)) break;
}//while
printf("%s\n",flag?"yes":"no");
}
return 0;
}

UVa 112 树求和的更多相关文章

  1. UVa 112 - Tree Summing(树的各路径求和,递归)

    题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...

  2. noip模拟8[星际旅行·砍树·超级树·求和]

    也不能算考得好,虽然这次A了一道题,但主要是那道题太简单了,没啥成就感,而且有好多人都A掉了 除了那一道,其他的加起来一共拿了25pts,这我能咋办,无奈的去改题 整场考试的状态并不是很好啊,不知道是 ...

  3. 6.17考试总结(NOIP模拟8)[星际旅行·砍树·超级树·求和]

    6.17考试总结(NOIP模拟8) 背景 考得不咋样,有一个非常遗憾的地方:最后一题少取膜了,\(100pts->40pts\),改了这么多年的错还是头一回看见以下的情景... T1星际旅行 前 ...

  4. UVa 10410树重建

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  5. uva 12086 树状数组

    树状数组 #include <cstdio> #include <cstdlib> #include <cmath> #include <map> #i ...

  6. UVa 1220 (树的最大独立集) Party at Hali-Bula

    题意: 有一棵树,选出尽可能多的节点是的两两节点不相邻,即每个节点和他的子节点只能选一个.求符合方案的最大节点数,并最优方案判断是否唯一. 分析: d(u, 0)表示以u为根的子树中,不选u节点能得到 ...

  7. UVa 112 Tree Summing

    题意: 计算从根到叶节点的累加值,看看是否等于指定值.是输出yes,否则no.注意叶节点判断条件是没有左右子节点. 思路: 建树过程中计算根到叶节点的sum. 注意: cin读取失败后要调用clear ...

  8. Uva 122 树的层次遍历 Trees on the level lrj白书 p149

    是否可以把树上结点的编号,然后把二叉树存储在数组中呢?很遗憾如果结点在一条链上,那将是2^256个结点 所以需要采用动态结构 首先要读取结点,建立二叉树addnode()+read_input()承担 ...

  9. UVa 11695 树的直径 Flight Planning

    题意: 给出一棵树,删除一条边再添加一条边,求新树的最短的直径. 分析: 因为n比较小(n ≤ 2500),所以可以枚举删除的边,分裂成两棵树,然后有这么一个结论: 合并两棵树后得到的新树的最短直径为 ...

随机推荐

  1. [BeiJing2006]狼抓兔子 dijkstra+平面图最小割

    一眼裸的最大流求最小割,然而数据范围过大,跑不下来. 我们可以将平面图转成对偶图,并进行连边. 这样,每条边的长度就对应原图中的割边长度. 起点到终点的最短路即为最小割. 别用SPFA,会死的很惨 C ...

  2. WordPress 增加 keywords 和 description

    WordPress 增加 keywords 和 description . <?php $keywords = '798资源网'; $description = '798资源网'; //文章页 ...

  3. js递归获取html页面所有标签

    js原生递归获取,直接源码 : <script> var child = document.children; var arr = [];//用来存放获取到的所有的标签 function ...

  4. BZOJ 4453 cys就是要拿英魂!(后缀数组+单调栈+平衡树)

    一开始的时候感觉就是一个主席树裸题. 然后发现自己错了. 首先建出后缀数组. 设\(i<j\) 如果\(rk[i]>rk[j]\)显然i更优. 如果\(rk[i]<rk[j]\)不一 ...

  5. 安装了python之后Windows的cmd中cd指令无法转换路径怎么办?

    1首先我们看看盘符,我的电脑里有 C D E,F. G盘. 2按下WIN+R键 输入cmd,打开cmd窗口. 3默认路径为用户文档路径,如果想切换到D盘 ,输入cd d: 是不行的. 4:AppDat ...

  6. python 与cpp接口编程

    (1)vc6下面生成dll学习 1.使用 VC6.0 生成 DLL新建项目 “Win32 Dynamic-Link Library”,输入项目名称,确定后选择 “A simple DLL projec ...

  7. 理解Swift中map 和 flatMap对集合的作用

    map和flatMap是函数式编程中常见的概念,python等语言中都有.借助于 map和flapMap 函数可以非常轻易地将数组转换成另外一个新数组. map函数可以被数组调用,它接受一个闭包作为參 ...

  8. Jquery控件jrumble

    <!DOCTYPE HTML> <html>  <head>   <title>demo.html</title>   <meta h ...

  9. 用DOM动态控制表格

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  10. 曲根英语万词---二、evoke

    曲根英语万词---二.evoke 一.总结 一句话总结:evoke v.唤起,引起 词根:-voc-, -vok- [词根含义]:声音,叫喊 1.consecrate? v,供奉,奉为神圣 -ate, ...