112 - Tree Summing***

/*
第一次接触建树解题
简单建树、历编,求和问题
解题思路:递归
方法一:只保留树的节点部分
方法二:建一棵完整的树
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,则无需太多要求*/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值