UVA 112 Tree Summing

原创 2013年07月07日 19:54:32

~~题目链接~~


题目大意:用()表示空节点, (5)表示一个为5的节点, 5()() 表示叶子节点, 5(2)(6)表示当前节点为5, 左节点为2,右节点为6.现在给出一串字符串, 求是否有根节点到叶节点的值等于给定的值。



code:

#include <iostream>
#include <algorithm>
using namespace std;

typedef struct node
{
    int num;
    struct node *lf, *rt;
}Node;

int n = 0, ans = 0;

int trans(string &s, int &start)//转换为数字
{
    int flag = 0, sum = 0;
    if(s[start] == '-') flag = 1, start++;
    else sum += s[start++]-'0';
    while(s[start] != '(' && s[start] != ')')
    {
        sum *= 10;
        sum += s[start++]-'0';
    }
    if(flag) sum = -sum;
    return sum;
}

int build(Node *r, string &s,int &cur, int sum)
{
    int cur_sum = 0;
    r->lf = new Node;
    r->rt = new Node;

    if(s[cur] == ')' && s[cur+1] == '(' && s[cur+2] == ')')//上一个节点为叶子节点
    {
        cur += 3;
        return 1;
    }
    else if(s[cur] != '(' && s[cur] != ')')
        r->num = trans(s, cur);

    cur_sum = sum+r->num;
    if(s[cur] == '(')//左子树
       if(build(r->lf, s, ++cur, cur_sum))//为叶节点判断
       {
           if(cur_sum == n)
               ans = 1;
       }

    if(s[cur] == '(')//右子树
       if(build(r->rt, s, ++cur, cur_sum))
        if(cur_sum == n) ans = 1;
    if(s[cur] == ')') cur++;
    return 0;
}

int main()
{
    int i = 0, j = 0, num = 0, flag = 1;//flag判断读取树没
    string s, res;
    while(cin>>n)
    {
        num = ans = 0;
        Node *r = new Node;
        res = "";//为最终的字符串
        do
        {
            getline(cin, s);
            string::iterator it = remove(s.begin(),s.end(), ' ');
            s.erase(it, s.end());
            for(i = 0; i<s.size(); i++)
                if(s[i] == '(') num++, flag = 0;
                else if(s[i] == ')') num--;
            res += s;
        }
        while(num || flag);
        if(res[1] != ')')//读出根节点的数
        {
            i = 1;
            r->num = trans(res, i);
            res.erase(res.end()-1);
            res.erase(res.begin(), res.begin()+i);
        }
        i = 0;
        build(r, res, i, 0);
        if(ans) cout<<"yes"<<endl;
        else cout<<"no"<<endl;
    }
    return 0;
}


UVA 112-Tree Summing

UVA 112-Tree Summing题目大意:输入一个数x,求在树上是否有路径的数之和与x相同解题思路:第一次做这种题目,一开始没思路,看了大神代码,才学到新知识,递归求解,当左右子树为空时返回#...
  • ZeroLH00
  • ZeroLH00
  • 2016-08-09 16:29:06
  • 198

UVA 112 Tree Summing

题目:   用一种奇怪的方法表示一棵树   ( A () () )   A 是节点的权值  里面两个括号表示两个儿子  。。。     问题是否存在从根节点到叶子权值和为 一个确定值的路径。 ...
  • u011276914
  • u011276914
  • 2013-10-05 23:38:36
  • 425

uva 112 tree summing

这题应该可以用栈结构直接
  • slyfc1
  • slyfc1
  • 2014-11-16 14:24:36
  • 294

UVA 112 Tree Summing

Tree Summing  Background LISP was one of the earliest high-level programming l...
  • u011217342
  • u011217342
  • 2013-07-29 10:08:12
  • 652

uva 112 Tree Summing

递归生成二叉树的题目,一开始的时候构建了二叉树,后来看了网上别人写的博客,领悟到程序只需要最终叶子节点的信息,所以是可以不用真实地构建二叉树的。又学到了程序设计的一点小窍门。 #include ...
  • xiaohaowudi
  • xiaohaowudi
  • 2013-10-06 19:32:21
  • 413

UVA 112 Tree Summing

UVA-112题意:给出n和一个用题目所描述的方式给出二叉树,求树中是否存在一条到叶子节点的路径和与n相等。 解题思路:关键在如何转换成树。首先我们知道,若当前是非空节点,则在 ( 后面必然有一个数...
  • QzNarsh
  • QzNarsh
  • 2016-07-18 21:59:45
  • 118

UVA 112 - Tree Summing

题目大意:给你一串字符串,可能是分行的,表示一棵二叉树的结构。问你是否存在,从根走到叶子的路径,使得所有值的和是否等于特定是数。 例如:(5(4(11(7()())(2()()))()) (8(13(...
  • qq_38638213
  • qq_38638213
  • 2017-09-04 19:26:58
  • 48

uva 112 Tree Summing

点击打开链接 题目意思:给定一个字符串,把字符串里面的数字建成一颗树,数字有可能是负号,所以这一题其实有很多可以学的,比如怎样输入会有多行,还有怎么建立一颗树,等等。 解题思路:我们用一个字...
  • cgl1079743846
  • cgl1079743846
  • 2012-07-03 12:42:51
  • 783

UVa 112 Tree Summing

题意不难理解,水题,不必建树,可以直接字符操作。   #include #include #include #include int n; int sum[105]; char str; int...
  • biluyang
  • biluyang
  • 2013-09-16 18:50:20
  • 287
收藏助手
不良信息举报
您举报文章:UVA 112 Tree Summing
举报原因:
原因补充:

(最多只允许输入30个字)