UVA-112
题意:给出n和一个用题目所描述的方式给出二叉树,求树中是否存在一条到叶子节点的路径和与n相等。
解题思路:关键在如何转换成树。首先我们知道,若当前是非空节点,则在 ( 后面必然有一个数字,当我们读取一个int 型读取不到时,代表这是一个空的节点。用一个dfs(sum,f1),sum表示根节点到当前节点的路径和,f1是个bool的指针,当这个点为空时为false。每次一个节点进来,先获得它的valve(如果非空的话) ,然后处理它的左子树,再处理它的右子树( 左子树的东西读完了就轮到又子树,题目中说的很清楚,(x()()),x为当前节点,第一个是左子树,第二个是右子树)。当一个节点的两个子节点都是空时它就是叶子节点,看此时sum是否等于n.
/*************************************************************************
> File Name: UVA-112.cpp
> Author: Narsh
>
> Created Time: 2016年07月18日 星期一 09时36分17秒
************************************************************************/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
int n;
void input() {
char tmp;
scanf("%c",&tmp);
while (tmp == '\n' || tmp == ' ')
scanf("%c",&tmp);
}
bool dfs(int sum,bool *f1){
bool ans=false,f2=false,f3=false;
int v;
input();
if (scanf("%d",&v)) {
*f1=true;
sum+=v;
ans= dfs(sum,&f2) | dfs(sum,&f3);
if (!f2 && !f3)
ans = sum == n;
}
input();
return ans;
}
int main() {
bool t;
while (scanf("%d",&n) != EOF) {
if (dfs(0,&t)) printf("yes\n");
else printf("no\n");
}
}