這題要讀取以字串表現的binary tree,並找出是否有root-to-leaf path能產生指定的數字和。因為字串跟數字混在一起,如何處理字串可說是這題的罩門,但其實想清楚了這題S-expression的模式,字串處理起來就沒有想像中的複雜了。
因為原本卡在如何擷取字串,也是第一次寫bin tree的東西,所以寫出來很開心!再進了百大,超超興奮!
TIPS
1. 數字會有負數
2. 注意 0 () 的測資,output應該要是 no
CODE
#include <stdio.h>
int a, found;
int tree(int parent_sum);
int makenum(int *a, int n, int sign);
int main(){
char c;
while( scanf("%d", &a) != EOF ){
while( (c = getchar()) !=EOF )
if( c == '(' )
break;
found = 0;
tree(0);
if( found == 1 )
printf("yes\n");
else
printf("no\n");
}/*while*/
exit(0);
}
/*return 0 if is empty node*/
int tree(int p){
int sign, line[10], e, num;
int flag, le, re;
char c;
flag = le = re = 1;
sign = 1;
e = num = 0;
while( flag == 1 ){
c = getchar();
if( c == '-' )
sign = -1;
else if( c >= '0' && c <= '9' ){
line[e] = c - '0';
e++;
}
else if( c == '(' ){
/*make number*/
num = makenum(line, e, sign);
/*left tree*/
if ( tree( num+p ) == 0 )
le = 0;
/*read '('*/
while( (c = getchar()) !=EOF )
if( c == '(' )
break;
/*right tree*/
if ( tree( num+p ) == 0 )
re = 0;
}
else if( c == ')' )
flag = 0;
else ;
}/*while flag is 1*/
if( (le + re == 0) && ((num+p) == a) ){
found = 1;
return 1;
}
if( e == 0 )
return 0;
return 1;
}
int makenum(int *a, int n, int sign){
int i, j, p, r;
r = a[n-1];
p = 1;
for(i=0; i<(n-1); i++){
for(j=1; j<=(n-i-1); j++)
p *= 10;
r += ( a[i] * p );
}
r *= sign;
return r;
}
No comments:
Post a Comment