题目链接:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=104&page=show_problem&problem=48
注意:1、有负数;2、空树答案为no.
版本一:
#include <iostream>
using namespace std;
bool proc_tree(int sum, int des, bool &chld)
{
char c;
int t;
bool lchld, rchld;
cin >> c;
if(cin >> t)
{
sum += t;
chld = true;
bool flag = proc_tree(sum, des, lchld) | proc_tree(sum, des, rchld); //此处若用||,可能会因为第一个操作数为真而不执行第二个操作数。
cin >> c;
if(!lchld && !rchld) return sum == des; //如果是叶子节点。
else return flag;
}
else
{
chld = false;
cin.clear();
cin >> c;
return false;
}
}
int main()
{
int des;
while(cin >> des)
{
bool chld;
cout << (proc_tree(0, des, chld) ? "yes" : "no") << endl;
}
return 0;
}
版本二:递归建树 + 搜索
#include <iostream>
using namespace std;
struct Node
{
int val;
int left, right;
Node(): left(-1), right(-1) {}
};
int cnt, des;
Node tree[10000];
int buildTree()
{
char c;
int t;
cin >> c;
if(cin >> t)
{
int tmp = ++cnt;
tree[tmp].val = t;
tree[tmp].left = buildTree();
tree[tmp].right = buildTree();
cin >> c;
return tmp;
}
cin.clear();
cin >> c;
return -1;
}
bool dfs(int idx, int sum)
{
if(idx == -1) return false;
sum += tree[idx].val;
if(tree[idx].left == -1 && tree[idx].right == -1)
{
return sum == des;
}
return dfs(tree[idx].left, sum) || dfs(tree[idx].right, sum);
}
void reset()
{
for(int i = 0; i <= cnt; ++ i)
{
tree[i].left = -1;
tree[i].right = -1;
}
}
int main()
{
while(cin >> des)
{
cnt = -1;
int head = buildTree();
cout << (dfs(head, 0) ? "yes" : "no") << endl;
reset();
}
return 0;
}
posted on 2011-11-24 21:50
wuxu 阅读(536)
评论(0) 编辑 收藏 引用 所属分类:
数据结构