一个有意思的题-小猴子下落

有一颗二叉树,最大深度为D,且所有叶子的深度都相同。所有结点从左到右从上到下的编号为1,2,3,·····,2的D次方减1。在结点1处放一个小猴子,它会往下跑。每个内结点上都有一个开关,初始全部关闭,当每次有小猴子跑到一个开关上时,它的状态都会改变,当到达一个内结点时,如果开关关闭,小猴子往左走,否则往右走,直到走到叶子结点。
一些小猴子从结点1处开始往下跑,最后一个小猴儿会跑到哪里呢?
输入
输入二叉树叶子的深度D,和小猴子数目I,假设I不超过整棵树的叶子个数,D<=20.最终以 0 0 结尾
输出
输出第I个小猴子所在的叶子编号。
样例输入
4 2
3 4
0 0样例输出
12
7

这道题就属于那种看起来简单,做起来还挺有意思的题。
分析下:
这个题把一棵二叉树的节点当做开关,根据开关的状态选择往左走还是往右走,走过节点后又改变节点的状态。因为开关的状态是010101交替,所以自然的按照下落的顺序的奇偶性分开两边。
比如,掉落的顺序是12345678
那么掉落第一层到达第二层的时候 奇数1357在左边,偶数2468在右边。
然后在左边的1357 经过第二层到达第三层的时候 15在左边 37在右边。
很容易发现 每经过一层,掉落在左边的总是数字的奇数位置,掉落在右边是偶数位置。这是为什么呢?
就像玩弹珠一样,当1357掉落在第二层的时候对于第二层的左边节点,相当于一个重新的开始毕竟1 3 5 7 加上1再除2以后 就是1 2 3 4~
binggo~
看着看着就发现了它的规律,随着层数的变化有两个值发生了变化:
1.技术位置的1357到了左边,偶数位置的2468到了右边,1357 对于第二层的左节点来说是全新的我们可以让1 3 5 7加1除2 得到1234 同理右边的2468除2得到1234
2.根据二叉树的原理,n的左节点是2*n,右节点是2*n+1。
所以自然有了以下代码:

// DO NOT INCLUDE ANY FILES 

int run_test(int nDepth, int num) 
{ 
    // WRITE YOUR CODES HEAR 
    int pos=1; 
    int i; 
    for(i=0;i<nDepth-1;i++) 
    { 
        if(num%2 == 1) 
        { 
            pos = 2*pos; 
            num=(num+1)/2; 
        } else { 
            pos=pos*2+1; 
            num/=2; 
        } 
    } 

    return node; 
} 

代码简单易懂,一个是用pos不断记录在当前层到的节点,不断的把到达该层的节点换算成1 2 3 4让他重新来过~
有意思吧 o( ̄ヘ ̄o#)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值