题目:S-Trees
题意:给出一棵满二叉树,每一层代表一个01变量,取0时往左走,取1时往右走。 给出所有叶子节点的值,输入要走的路径,问最终走到叶子节点位置的值为多少?
思路:题目给出一些根结点的名称都没有用。
按二分法的思想:
(1)首先将叶子节点的头和尾位置记录下;
(2)然后遍历输入的路径,
0:向左走,尾节点要更新
1:向右走,头节点要更新
每次更新的值为(头+尾)/2的值
最后遍历完路径得出的(头+尾)/2的值即为最终叶子节点的位置
将所有的路径都走完记录位置即为所求。
代码:
#include <iostream>
#include <stdio.h>
using namespace std;
int main(){
int n,kcase=1;
char str[10],tree[150],ans[120];
while(scanf("%d",&n)!=EOF && n){
for(int i=0;i<n;i++) scanf("%s",str);
scanf("%s",tree);
int num;
scanf("%d",&num);
for(int i=0;i<num;i++){
scanf("%s",str);
int head=0,tail= (2<<n-1)-1;//初始位置为叶子节点的头和尾位置
int temp = (head+tail)/2;//用temp记录每次二分的位置
for(int j=0;str[j]!='\0';j++){
if(str[j] == '0') tail = temp;//当为0说明尾位置要改变
else head = temp+1;//为1头位置要改变
temp = (head+tail)/2;//每次求二分位置
}
ans[i] = tree[temp];//最后的二分位置即为叶子节点的位置
}
ans[num] = '\0';
printf("S-Tree #%d:\n%s\n\n",kcase++,ans);
}
return 0;}