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

来源:互联网 发布:linux dns如何配置文件 编辑:程序博客网 时间:2024/04/29 11:16

有一颗二叉树,最大深度为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