# UVA 112 Tree Summing

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 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)