#C++初学记录(树和二叉树)

二叉树的编号
例题 6-6 小球下落问题
有一棵二叉树,最大深度为D,且所有叶子深度都相同。所有节点从上到下,从左到右编号为1,2,3,4,....,2^D-1。在节点1处放置小球,他会往下落。每个节点上都有一个开关,初始全部关闭,每当有小球落到一个开关上时,状态都会改变,当一个小球到达节点时,如果该节点上的开关关闭则往左走,否则往右走,直到走到叶子节点,一些小球从节点1处开始依次下落。最后一个小球回到哪里呢?输入叶子深度D,小球个数I,输入第I个小球最后所在的叶子编号。假设I不超过整棵树的叶子个数,D<=20。输入最多包含1000组数据。
get
4 2
3 4
10 1
2 2
8 128
16 12345
put
12
7
512
3
255
36358

#include<iostream>
#include<cstring>
const int maxd=20;
int s[1<<maxd];
int main()
{
    int D,I;
    while((cin>>D>>I)==2)
    {
        memset(s,0,sizeof(s));
        int k=1,n=(1<<D)-1;
        for(int i=0;i<I;i++)
        {
            k=1;
            for(;;;)
            {
                s[k]=!s[k];
                k=s[k]?2*k:2*k+1;
                if(k>n)break;
            }
        }
        cout<<k/2<<endl;
    }
    return 0;
}

代码非常基础不难理解,用k表示小球现在所在的节点位置再进行判断是否出界出界则跳出循环后进行下一步循环并且对k进行初始化,直到循环结束即第I个小球下落到底。

猜你喜欢

转载自www.cnblogs.com/xiaofengqaq/p/11242318.html