UVA 112 Tree Summing二叉木


テーマリンク:
http://uva.onlinejudge.org/index.php?option=com_オンラインjudge&Itemid=8&page=show_problem&problem=48
この問題の難点は、問題が与えられた入力データをどのようにツリーに変換するかです.まず文字型変数cを定義して、もう一つの整数変数numを定義します.初めは必ず'('、'、だから先にc(cin>>>>cを入力して判断して、'('、であればnum(cin>>>numを入力します.)ここで判断を加えます.cin>>num入力が正常であれば、入力は一つの数です.もし入力が異常であれば、入力は'です.'.こうして、括弧の入力と数字の入力を分けることができます.そして、スタックに入れて、スタックを出して、二叉の木に変えて、dfsにします.
具体的なコード:

#include<iostream>
#include<cstdlib>
#include<stack>
using namespace std;

struct Node
{
	int value;
	Node *left,*right;
};

int I;
bool dfs(Node *n,int sum)
{
	sum+=n->value;
	if(!n->left&&!n->right&&sum==I) return 1;
	if(n->left&&dfs(n->left,sum)) return 1;
	if(n->right&&dfs(n->right,sum)) return 1;
	return 0;
}		
int main()
{
	//freopen("in.txt","r",stdin);
	int num;
	char c;
	stack<Node *> s_Node;
	while(cin>>I)
	{
		while(!s_Node.empty()) s_Node.pop();
		int left_num=0,right_num=0;//       
		do
		{
			cin>>c;
			if(c=='(')
			{
				if(!(cin>>num))//      ,   ')'
				{
					cin.clear();
					cin>>c;
					Node *tmp=NULL;
					s_Node.push(tmp);
				}
				else
				{
					left_num++;
					Node *tmp=(Node *)malloc(sizeof(Node));
					tmp->value=num;
					tmp->left=tmp->right=NULL;
					s_Node.push(tmp);
				}
			}
			else
			{
				right_num++;
				Node *tmp,*left,*right;
				right=s_Node.top();
				s_Node.pop();
				left=s_Node.top();
				s_Node.pop();
				tmp=s_Node.top();
				tmp->left=left;
				tmp->right=right;
			}
		}while(left_num>right_num);
		Node *root=s_Node.top();
		s_Node.pop();
		if(root)
		{
			if(dfs(root,0))
				cout<<"yes"<<endl;
			else
				cout<<"no"<<endl;
		}
		else
			cout<<"no"<<endl;
	}
	return 0;
}