~~题目链接~~
题目大意:用()表示空节点, (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;
}