大概是把一个二叉树通过括号标记存到一个线性表里,然后算根到叶子的和。给出的带括号的形式其实就是这个树的dfs的栈,左括号入,右括号出,因此不需要重建树,直接怼就行。然后我用一个数组记录访问次数以此判断是否为叶子。在网上看到有大神的代码巧妙利用cin流的各种函数来处理输入,不明觉厉。
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int sta[10000];
int vis[10000];
int cnt[10000];
int sum;
int main()
{
while(scanf("%d (",&sum)!=EOF){
memset(vis,0,sizeof(vis));
int top=1,neg=1,n=0,flag=0,suc=0,m=0; char c;
while(top){
c=getchar();
if(c==')'){
if(!vis[top]) cnt[top]++;
else{
if(cnt[top+1]==2 && m==sum) suc=1;
vis[top]=0; m-=sta[top];
cnt[top+1]=0;
}
top--;
}
if(c=='(') {
if(flag){
sta[top]=n*neg; m+=sta[top];
n=0; flag=0; neg=1;
vis[top]=1;
}
top++;
}
if(c>='0'&&c<='9'){
flag=1;
n=n*10+c-'0';
}
if(c=='-') neg=-1;
}
if(suc) cout<<"yes\n";
else cout<<"no\n";
}
return 0;
}