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;
}


POJ 题目1145/UVA题目112 Tree Summing(二叉树遍历)

Tree Summing Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8132   A...
  • yu_ch_sh
  • yu_ch_sh
  • 2015年08月21日 10:38
  • 751

Tree Summing - UVa 112 简单二叉树(丧病的数据输入)

Tree Summing  Background LISP was one of the earliest high-level programming languag...
  • u014733623
  • u014733623
  • 2014年05月12日 22:37
  • 553

UVA - 112 - Tree Summing (数的求和!栈的应用!)

UVA - 112 Tree Summing Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format:...
  • u014355480
  • u014355480
  • 2014年12月18日 21:06
  • 612

二叉树专题 Tree Summing

LISP was one of the earliest high-level programming languages and, with FORTRAN, is one of the oldes...
  • wjlwangluo
  • wjlwangluo
  • 2017年07月04日 20:48
  • 86

UVA 112(二叉树、DFS)

I - Tree Summing Crawling failed Submit Status Appoint description:  System Crawler  (2014-0...
  • u013268685
  • u013268685
  • 2014年05月29日 17:50
  • 670

UVa 112 树求和

题意:给定一个数字,以及一个描述树的字符序列,问存不存在一条从根到某叶子结点的路径使得其和等于那个数。难点在于如何处理字符序列,因为字符间可能有空格、换行等。 思路:本来想着用scanf的(后发现s...
  • buxizhizhou530
  • buxizhizhou530
  • 2014年08月26日 00:09
  • 1035

【九度OJ】题目1124:Digital Roots 解题报告

【九度OJ】题目1124:Digital Roots 解题报告标签(空格分隔): 九度OJ原题地址:http://ac.jobdu.com/problem.php?pid=1124题目描述:The d...
  • fuxuemingzhu
  • fuxuemingzhu
  • 2017年03月05日 22:07
  • 930

习题4-8 特别困的学生 UVa12108

#define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #define N 1000000 int n...
  • u014800748
  • u014800748
  • 2014年08月06日 21:35
  • 1869

UVA-815 flooded!(白书说能锻炼思维的题)

题意挺长的,而且是英文的,我这里就简述一下吧,就是有m*n个格子,每个格子都是10*10的规格(高度是无限的),给出每个格子的海拔,然后给出一个洪水的量,输出最后水深度和完全被水覆盖的面积百分比。这个...
  • FishSeeker
  • FishSeeker
  • 2016年04月08日 09:36
  • 953

leetcode112题 题解 翻译 C语言版 Python版

112. Path Sum Given a binary tree and a sum, determine if the tree has a root-to-leaf path such tha...
  • yingzinanfei
  • yingzinanfei
  • 2016年04月19日 15:05
  • 354
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVA 112 Tree Summing
举报原因:
原因补充:

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