UVA 112 Tree Summing二叉木
2504 ワード
テーマリンク:
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にします.
具体的なコード:
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;
}