#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <vector>
#include <stack>
#include <deque>
#include <queue>
#include <bitset>
#include <list>
#include <map>
#include <set>
#include <iterator>
#include <algorithm>
#include <functional>
#include <utility>
#include <sstream>
#include <climits>
#include <cassert>
#define MID(x,y) ( ( x + y ) >> 1 )
#define L(x) ( x << 1 )
#define R(x) ( x << 1 | 1 )
#define BUG puts("here!!!");
#define STOP system("pause");
using namespace std;
struct Node {
int value;
Node* lchild;
Node* rchild;
};
bool flag;
Node* create() {
char ch;
int v;
while(scanf("%c", &ch) && (ch == '(' || ch == ' ' || ch == '\n'));
if(ch == ')') return NULL;
cin.putback(ch);
scanf("%d", &v);
Node* root = new Node();
root->value = v;
root->lchild = create();
root->rchild = create();
while(scanf("%c", &ch) && ch != ')');
return root;
}
void inOrder(Node* root) {
if(root == NULL) return;
printf("%d ", root->value);
if(root->lchild) inOrder(root->lchild);
if(root->rchild) inOrder(root->rchild);
}
void findPath(Node* pr, int exSum, int curSum) {
curSum += pr->value;
if(curSum == exSum && pr->lchild == NULL && pr->rchild == NULL) {
flag = true;
return;
}
if(!flag && pr->lchild != NULL) {
findPath(pr->lchild, exSum, curSum);
}
if(!flag && pr->rchild != NULL) {
findPath(pr->rchild, exSum, curSum);
}
if(!flag) curSum -= pr->value;
}
void solve(Node* root, int exSum) {
if(root == NULL) {
flag = false;
return;
}
int curSum = 0;
findPath(root, exSum, curSum);
}
int main() {
int tar;
while(scanf("%d", &tar) != EOF) {
flag = false;
Node* root = create();
solve(root, tar);
if(flag) printf("yes\n");
else printf("no\n");
}
return 0;
}
poj 1145 二叉树和为某一值的情况
最新推荐文章于 2020-01-07 01:14:05 发布