UVA 112 Tree Summing

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");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值