#include <cstdio>
char input() { //读取括号
char temp = getchar();
while (temp == ' ' || temp == '\n')
temp = getchar();
return temp;
}
bool judge(int sum, bool *leaf) {
bool real = false, left = false, right = false; // real : 是否存在一条分支的所有结点的和等于sum
int value; // left : 是否左子结点为空 right : 是否右子结点为空
scanf("%d", &value);
char temp = input();
if (temp == '(') { //判断是否有子结点
if (judge(sum - value, &left)) //判断以左子结点为 root 的树, 是否存在一条分支的所有结点的和等于 sum - value
real = true;
temp = input(); //读取掉右括号
if (judge(sum - value, &right)) //判断以右子结点为 root 的树, 是否存在一条分支的所有结点和等于 sum - value
real = true;
temp = input();
if (left && right) //如果左子结点和右子结点都为空,则该结点是 leaf ,判断该 leaf 结点的值是否等于 sum
real = (sum == value);
}
else //返回左子结点或右子结点为空
*leaf = true;
return real;
}
int main() {
int num;
bool leaf = false;
while (scanf("%d", &num) != EOF) {
input(); //读取掉第一个左括号
judge(num, &leaf) ? printf("yes\n") : printf("no\n");
}
return 0;
}
UVA 112 Tree Summing
最新推荐文章于 2018-05-11 10:49:08 发布