
#include<stdio.h>#include<string.h>#include<math.h>#include<ctype.h>#define MAXN 300int operation(int i, int *tree, int len){//找到叶子节点的值并返回 if(2*i+2 >= len) return tree[i]; else { if(tree[i] == 0) return operation(2*i+1, tree, len); else return operation(2*i+2, tree, len); }}int main(){ int n, i, j, m, sum, temp, flag, t, times, k, cnt = 0; int s_Tree[MAXN], order[10], read[10]; char ch; while(scanf("%d", &n) != EOF && n) { getchar(); i = flag = 0; memset(order, 0, sizeof(order)); while((ch = getchar()) != 'n') {//处理输入,将xn中的数放到数组order中 if(isdigit(ch)) { order[i] = order[i]*10 + (ch - '0'); flag = 1; } else if(flag == 1) { i++; flag = 0; } } memset(s_Tree, 0, sizeof(s_Tree)); sum = (int)pow(2.0, (double)n) - 1; //找到叶子节点的存储位置先 m = (int)pow(2.0, (double)n);//叶子节点的数量 for(i=0; i<m; ++i, ++sum) {//存放叶子节点的值 ch = getchar(); s_Tree[sum] = ch - '0'; } scanf("%d", &m); getchar(); for(i=0; i<m; ++i) {//存放xn的0/1值到数组read中 for(j=1; j<=n; ++j) { ch = getchar(); read[j] = ch - '0'; } getchar(); for(k=t=0; t<n; ++t) {//设定各非叶子节点的值即0或者1 times = (int)pow(2.0, (double)t); while(times--) s_Tree[k++] = read[order[t]]; } if(i == 0) printf("S-Tree #%d:n", ++cnt); printf("%d", operation(0, s_Tree, sum)); } printf("nn"); } return 0;}欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)