// uva 112 - Tree Summing
// 题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=104&page=show_problem&problem=48
// 题目大意: 给一个整数n和一颗树,求是否存在一条从根节点到叶节点的和等于这个整数
#include <cstdio>
#include <cstring>
#include <iostream>
#include <stack>
#include <cctype>
using namespace std;
int nN, nBuf;
char chBuf;
struct Node{
bool negative;
int val;
bool notEmpty;
Node *left, *right;
};
stack<char> sta;
stack<Node*> staNode;
Node *head, *nowNode;
bool flag;
void Solve();
void getSum(Node*, int);
void Delete(Node*);
int main(){
while(cin >> nN){
while((chBuf = getchar()) != '('){}
sta.push(chBuf);
nowNode = new Node();
head = nowNode;
while(sta.size()){
chBuf = getchar();
if(isdigit(chBuf)){
if(nowNode->notEmpty == false){
nowNode->val = chBuf - '0';
nowNode->notEmpty = true;
}else{
nowNode->val *= 10;
nowNode->val += chBuf - '0';
}
}else if(chBuf == '('){
sta.push(chBuf);
Node* newNode = new Node();
if(nowNode->left == NULL){
nowNode->left = newNode;
}else{
nowNode->right = newNode;
}
staNode.push(nowNode);
nowNode = newNode;
}else if(chBuf == '-'){
nowNode->negative ^= 1;
}else if(chBuf == ')'){
sta.pop();
if(sta.size()){
nowNode = staNode.top();
staNode.pop();
}
}
}
Solve();
}
return 0;
}
void Solve(){
flag = false;
if(head->notEmpty)
getSum(head, 0);
if(flag)
cout << "yes" << endl;
else
cout << "no" << endl;
Delete(head);
}
void getSum(Node* ptr, int sum){
if(ptr->negative)
sum -= ptr->val;
else
sum += ptr->val;
if(ptr->left != NULL && ptr->left->notEmpty)
getSum(ptr->left, sum);
if(ptr->right != NULL && ptr->right->notEmpty)
getSum(ptr->right, sum);
if(ptr->left==NULL && ptr->right == NULL || !ptr->left->notEmpty && !ptr->right->notEmpty){
if(sum == nN)
flag = true;
}
}
void Delete(Node* root){
if(root->notEmpty){
Delete(root->left);
Delete(root->right);
}
delete(root);
}
uva 112 - Tree Summing
最新推荐文章于 2014-06-24 09:40:01 发布