链接:https://vjudge.net/contest/477437#problem/B
题意:给一个树(描述方法非常烦人),要求查看是否有某个 从根到叶子的路径节点数值之和 等于给定的值。
题解:用cin来交替输入char和int,可以比较好地将字符与数字分离(过程中记得cin.clear() )
#include<iostream>
using namespace std;
int ans,sum;
bool flag;
bool ok;
/*
题目中可以抽象为( 根节点 (左子树) (右子树) )
如何判断是叶子节点? (节点值 () () )
*/
bool dfs(int sum){
int n;//当前走到的节点的数值
char l,r;//用来输入左右括号,实际没什么用
bool ll,rr;//记录左右是否有子树
cin>>l;//消去左括号
cin.clear(); //这里必须clear,否则会wa
if(cin>>n){
ok=1;//打标记,证明这不是一个空树
sum+=n;
cin.clear(); //这里必须clear,否则会wa
ll=dfs(sum);//递归进入左子树
rr=dfs(sum);//递归进入右子树
if(ll&&rr&&sum==ans) flag=1;//查看当前节点是否是叶子节点,如果是就与答案比较
cin>>r;//消去右括号
return 0;//返回值,此处代表访问的括号对里面有东西
}
cin.clear(); //这里必须clear,否则会wa
cin>>r;//消去右括号
return 1;//返回值,此处代表访问的括号对里面没有东西
}
int main(){
while(cin>>ans){
ok=0;
flag=0;
sum=0;
dfs(0);
if(flag&&ok){
cout<<"yes"<<endl;
}else{
cout<<"no"<<endl;
}
}
}