uva 112 TreeSumming

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
//poj上过了,但是uva上runtime error,碉堡了、、、、
const int MAXN=1500;
int sum;
char s[MAXN];

int dfs(char t[],int num)
{
int i,j,k,v;
int len=strlen(t);
if(!strcmp(t,"()"))//左子树或者右子树为空的情况
{
free(t);
return 0;
}
char r[5];
sscanf(&t[1],"%d",&v);//
for(i=1;i<len;i++)
if(t[i]=='(') break;
for(k=0;k<4;k++)
r[k]=t[i+k];
r[4]='\0';
if(!strcmp(r,"()()"))//如果是叶子节点
{
free(t);
if(v+num==sum)
return 1;//找到
return 0;
}
for(i=1;i<len;i++)
if(t[i]=='(') break;
int flag=1;
for(j=i+1;j<len;j++)
{
if(!flag) break;
if(t[j]=='(') flag++;
if(t[j]==')') flag--;
}
int lchild=j-i;//左子树表达式的长度
char *pre=(char *)malloc((lchild+1)*sizeof(char));
flag=1;
pre[0]=t[i];k=1;
for(j=i+1;j<len;j++)
{
if(!flag) break;
if((pre[k]=t[j])=='(') flag++;
if((pre[k]=t[j])==')') flag--;
k++;
}//把左子树作为一棵新的树赋给pre
pre[k]='\0';
char *post=(char*)malloc((len-lchild-2)*sizeof(char));
for(k=0;k+j<len;k++)
post[k]=t[k+j];
post[k-1]='\0';//把右子树作为一棵新的树赋给post
free(t);//t没用了,所以释放掉
if(dfs(pre,v+num)) return 1;//左子树中有叶子节点的总值为sum
if(dfs(post,v+num)) return 1;//右子树中有叶子节点的总值为sun
return 0;
}

int main()
{
//freopen("sample.txt","r",stdin);//把这一行消注释的话可以把"sample.txt"文档的数据读出来,就省得老是手写输入,累死了、、、、、
char c;
while(scanf("%d",&sum)!=EOF)
{
int flag=0,temp=0;
memset(s,0,sizeof(s));
while((c=getchar())==' ')
{
;
}
flag++;
s[temp++]=c;
while(!((flag==0)&((c=getchar())=='\n'||c==EOF)))///其实有些程序并不是那么难,只不过我们把它想麻烦了而已,思路简单点未尝不可
{
if(c==')')
{
s[temp++]=c;
flag--;
}
else if(c=='(')
{
s[temp++]=c;
flag++;
}
else if(c=='\n'||c==' ')
{
;
}
else
{
s[temp++]=c;
}
}
s[temp]='\0';
// printf("%s\n",s);
if(!strcmp(s,"()"))
printf("no\n");
else if(dfs(s,0))
printf("yes\n");
else printf("no\n");
}
return 0;
}

有人知道为什么runtime error的话,还请赐教啊,不胜感激


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值