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