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

二叉树基础题 1. 去空格  2.由括号表达式建树(用两个栈)  3.搜索 此题先是参考了下别人的代码,算是基础的练习+复习。 #include #include #include #inc...

uva 112 Tree Summing

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

uva 112 - Tree Summing

// uva 112 - Tree Summing // 题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid...

UVa 112 - Tree Summing解题报告

题意: 题目要求很简单,意思是要构造一颗二叉树,然后求出所有根结点到叶结点的路径上的数字之和,如果有一个是和题目所给的一样,那么输出yes,否则no 左括号‘(' 表示新建一个子结点, 优...

UVA112 Tree Summing

好吧,线性表的题先跳过了,大多是一些无脑但是复杂的模拟。 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=43041#probl...

UVA_112_Tree Summing

#include #include #include #include #include using std::cin; using std::cout; using std::endl; using...
  • cxy7tv
  • cxy7tv
  • 2016年04月06日 18:24
  • 90

UVa 112 - Tree Summing

Tree Summing Background LISP was one of the earliest high-level programming lang...

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

Tree Summing Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8132   A...

Uva 112-Tree Summing//建树,遍历

这道题参考了大牛们的结题报告。很久没这样了。关键是这题很是坑人,输入有点困难。这道题不用建树,只需要判断叶子的位置就ok了。     刚开始一直在纠结如何处理输入的问题,看了下大牛的代码,很简短,但...
  • mr_zys
  • mr_zys
  • 2013年02月04日 22:40
  • 647

uva_112 - Tree Summing (树的求和)

Tree Summing  Background LISP was one of the earliest high-level programming langu...
  • HTT_H
  • HTT_H
  • 2014年08月22日 09:59
  • 355
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVA 112 Tree Summing
举报原因:
原因补充:

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