/*
第一次接触建树解题
简单建树、历编,求和问题
解题思路:递归
方法一:只保留树的节点部分
方法二:建一棵完整的树
cin.clear()清除
*/
/*方法一:
#include <iostream>
#include <string>
using namespace std;
bool ok;
bool tree_sum(int n,int sum)
{
char ch;
cin>>ch;
int v;
if(!((cin>>v)==0))
{
n+=v;
bool t;
t=tree_sum(n,sum)|tree_sum(n,sum);
if(!ok && !t)
ok=(n==sum);
cin>>ch;
return true;
}
else
{
cin.clear();
cin>>ch;
return false;
}
}
int main()
{
int sum;
while(!((cin>>sum)==0))
{
ok=false;
tree_sum(0,sum);
cout<<(ok?"yes":"no")<<endl;
}
return 0;
}
*/
//方法二:
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
bool ok;
struct Node
{
Node *lchild,*rchild;
};
Node *creat_tree(int n,int sum)
{
char ch;
cin>>ch;
int v;
if(!((cin>>v)==0))
{
n+=v;
Node *root=(Node *)malloc(sizeof(Node));
root->lchild=creat_tree(n,sum);
root->rchild=creat_tree(n,sum);
if(!ok && root->lchild==NULL && root->rchild==NULL)
ok=(n==sum);
cin>>ch;
return root;
}
else
{
cin.clear();
cin>>ch;
return NULL;
}
}
int main()
{
int sum;
while(!((cin>>sum)==0))
{
ok=false;
creat_tree(0,sum);
cout<<(ok?"yes":"no")<<endl;
}
return 0;
}
第二次做,用C实现,结果Runtime error
#include <cstdio>
#include <cstring>
const int nMax=100000000;//Runtime error:可能是数组开的不够大,但是还是Runtime error,不知道原因何在?
int I;
char T[nMax];
int m;
int tree[nMax];
bool ok;
void init()
{
int flag=0;
int first=1;
while(first || flag)
{
char c=getchar();
if(c==' ' || c=='\t' || c=='\n') continue;
else if(c=='(') {flag++;if(first) first=0;}
else if(c==')') {flag--;if(first) first=0;}
T[m++]=c;
}
}
int get_dig(int i,int &k)
{
int num=0;
int p=1;
if(T[i]=='-')
{
p=-1;
i++;
}
else if(T[i]=='+')
i++;
while(T[i]>='0' && T[i]<='9')
{
num=num*10+T[i]-'0';
i++;
}
k=i;
return p*num;
}
int build(int k,int cur)
{
int a,p;
int x,y;
a=get_dig(k+1,p);
if(p==k+1)
{
tree[cur]=-1;
return k+2;
}
else
{
tree[cur]=a;
x=build(p,2*cur);
y=build(x,2*cur+1);
return y+1;
}
}
void traverse(int cur,int num)
{
if(!ok)
{
if(tree[cur]==-1)
{
if(num==I)
ok=1;
return;
}
traverse(2*cur,num+tree[cur]);
traverse(2*cur+1,num+tree[cur]);
}
}
int main()
{
//freopen("f://data.in","r",stdin);
while(scanf("%d",&I)!=EOF)
{
m=0;
ok=0;
init();
build(0,1);
traverse(1,0);
if(ok)
printf("yes\n");
else
printf("no\n");
}
return 0;
}
/*当我想要取消使用数组的时候,发现使用C语言中的scanf处理事时无比的困难,
而cin的一大优势,就是可以忽略空字符
所以:要是使用scanf,最好使用数组存储
而cin,则无需太多要求*/