说说:
哈哈,今天刷的题感觉难度不是很大嘛,淡淡地又刷了道树的题。其实还是简单的树的遍历。题目首先给你一个整数I,然后问你在root-to-leaf的值中有没有和I相等的,有输出yes,否则输出no。而root-to-leaf也就是从根到叶子节点的整条路径中,所有节点的值的和。解法自然是遍历整棵树,到达根后将root-to-leaf保存到一个数组中即可。具体的还是看代码好了~
源代码:
#include <stdio.h>
#include <string.h>
#define MAX 1000
int sum;
int path[MAX];//叶子到根的路径上所有节点的和
int leaf_num;//叶子的数目
int find(void);
int main(){
int I,i;
int yes;
char c;
// freopen("data","r",stdin);
while(~scanf("%d",&I)){
memset(path,0,sizeof(path));
leaf_num=yes=sum=0;
find();
for(i=0;i<leaf_num;i++)
if(path[i]==I){
yes=1;
break;
}
if(yes)
printf("yes\n");
else
printf("no\n");
}
return 0;
}
int find(){
char c;
int node;
int r1,r2;
while((c=getchar())!='(');
while((c=getchar())==' ');
if(c==')')//说明已到树的尽头
return 1;
else{
ungetc(c,stdin);
scanf("%d",&node);
sum+=node;
r1=r2=0;
while((c=getchar())!='(');
ungetc(c,stdin);
r1=find();//进入左子树
while((c=getchar())!='(');
ungetc(c,stdin);
r2=find();//进入右子树
while((c=getchar())!=')');
if(r1&&r2)//叶子
path[leaf_num++]=sum;
sum-=node;//注意回溯
return 0;
}
}原文地址:http://blog.csdn.net/u011915301/article/details/39210089