Uva712 S-Trees 【二分思想】【习题6-2】

来源:互联网 发布:怎么样信任软件 编辑:程序博客网 时间:2024/06/12 01:16

题目: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;}


0 0