#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) 叶子节点的判断,当“叶子”(左、右)节点的高度等于“父节点”高度加一,则“父节点”才是真正的叶子节点