#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
bool flag=false;
int kk;
char GetNext()  //将没用的符号过滤掉
{
	char c;
	while(scanf("%c",&c) && (c==' ' || c=='\n' || c==9 || c==10));
	return c;
}
int dfs(int sum,int hight)
{
    int sign=1,k=0,k1,k2;
	char c;
	c=GetNext();  
	if(c==')')
	{
		return hight;
	}
	if(c=='-')//当为负数时
	{
		sign=-sign;
		c=GetNext();
	}
	while((c>='0' && c<='9'))//取数字
	{
        k=k*10+(c-'0')*sign;
		scanf("%c",&c);
	}
	if(c=='\n' || c==' ') c=GetNext();
    
    if(c=='(') k1=dfs(sum+k,hight+1); //返回左孩子高度
	c=GetNext();
	if(c=='(') k2=dfs(sum+k,hight+1);//返回右孩子高度
	c=GetNext();

	if(k2==hight+1 && k1==hight+1)//判断是否是叶子节点
	{
		if(sum+k==kk) flag=true;
	}
    return 0;
}


int main()
{
	while(scanf("%d",&kk)!=EOF)
	{
		flag=false;
		GetNext();
		dfs(0,0);
		//GetNext();
		if(flag)
			printf("yes\n");
		else
			printf("no\n");
	}
	return 0;
}

 

本题就是树的遍历,由于特殊的形式所以在实现上有点麻烦,主要注意两点情况:

(1)       数值可以为负

(2)       叶子节点的判断,当“叶子”(左、右)节点的高度等于“父节点”高度加一,则“父节点”才是真正的叶子节点 

相关文章: