uva 112
#include <iostream> using namespace std; int a[100000]; int nLeaves; typedef struct treeNode { int data; treeNode*left,*right; treeNode():data(),left(NULL),right(NULL){} treeNode(int x):data(x),left(NULL),right(NULL){} }treeNode; inline bool isnum(char ch) { return ((ch>='0' && ch<='9') || '-'==ch ); } inline int ch2int(char ch) { return (ch-48); } void createTree(treeNode*& root) { char ch; int x=0; while(1) { ch=getchar(); if(')'==ch) { return; } else if(isnum(ch)) { x=0; int a=1; if('-'==ch) { a=-1; ch=getchar(); } while(isnum(ch)) { x=10*x+ch2int(ch); ch=getchar(); } x*=a; root=new treeNode(x); createTree(root->left); createTree(root->right); } } } void destroyTree(treeNode* root) { if(NULL==root) return ; destroyTree(root->left); destroyTree(root->right); delete root; } void getSum(treeNode*& root) { if(NULL==root->left && NULL==root->right) { a[nLeaves++]=root->data; } if(NULL!=root->left) { root->left->data+=root->data; getSum(root->left); } if(NULL!=root->right) { root->right->data+=root->data; getSum(root->right); } } int main() { treeNode* root; int pathSum; while (cin>>pathSum) { root=NULL; createTree(root); if(NULL==root) { cout<<"no"<<endl; continue; } nLeaves=0; getSum(root); bool flag=false; for (int i=0;i<nLeaves;i++) { if(a[i]==pathSum) { cout<<"yes"<<endl; flag=true; break; } } if(!flag) cout<<"no"<<endl; destroyTree(root); } return 0; }