题意:有一棵完全二叉树,每层元素有同一变量表示,从上到下分别为x1,x2,... 最后一层叶子结点会有0或1的赋值,输入给出。然后如果xi取值为0时,则往左子树走,否则往右子树走,直到走到叶子结点,得到一值。
思路:因为是完全二叉树,可以用顺序存储,数组实现即可。另外也只需存叶子结点的值就行了。对一结点k来说,左孩子是2k,右孩子是2k+1。因为高度最大为7,最多有x7,所以可以直接取数组的第二位,即下标1,来获得xk中的k。
注意:每个测试样例后有个空行,WA了一次~
二维数组作形参: 一是 char (*pt)[4] ; 二是 char pt[][5] 如果写成char *pt[5] 就会提示错误:cannot convert `char (*)[5]‘ to `char**‘ for argument `3‘ to `void process(char*, int, char**)‘ 意思是实参是char(*)[5],而形参是char**,不匹配。
[ ]的优先级高于*,char (*pt)[4] 表示一个指向数组的指针,指向具有4个char值的数组的指针;char *pt[5] 表示指针数组,char型指针数组、有5个元素。
Code:
#include<stdio.h> #include<string.h> #define MAXN 200 void process(char *vva,int len,char varord[][5]); int tree[MAXN]; int main() { int cnt=1; int n; while(scanf("%d",&n)==1 && n) { char varord[8][5]; for(int i=0;i<n;++i) scanf("%s",varord[i]); getchar(); for(int i=0;i<(1<<n);++i) { char c=getchar();//printf("%c ",c); tree[(1<<n)+i]=c-'0'; } //for(int i=0;i<(1<<n);++i) // printf("%d ",tree[i+(1<<n)]); int m; scanf("%d",&m); printf("S-Tree #%d:\n",cnt++); for(int i=0;i<m;++i) { char vva[10]; scanf("%s",vva); process(vva,strlen(vva),varord); } printf("\n\n"); } return 0; } void process(char *vva,int len,char varord[][5]) { int k=1; for(int i=0;i<len;++i) { int t=varord[i][1]-'0';//因最多是x7,所以这里可以直接减字符0。注意下标是1不是2. if(vva[t-1]=='0') k=2*k; else k=2*k+1; } printf("%d",tree[k]); }
时间: 2024-12-23 12:07:08