二叉树的编号

例题 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个小球下落到底。

但是,这样做的代码有一个明显的缺陷,那就是时间复杂度问题,运算量太大,由于I可以高达2D-1,每组测试数据下落总层数可能会高达(219)*19=9961472,并且一共可能有10000组数据。

还有一种方法我们可以这样理解,每个小球都会落到根节点上,并且前两个小球一定必然是一个落在左边子树上一个落在右边子树上,一般的,只需要看小球编号的奇偶性,就能直到他最终会在那棵子树中,对于那些落入根节点左子树的小球来说,只需要知道该小球是第几个落在根的左子树,就可以直到他下一步往左还是往右了,依次类推,直到小球落到叶子上为止。

如果使用题目中给的编号I,则当I是奇数时,他是往左走的第(I+1)/2个小球,当I是偶数时,他是往右走的第I/2个小球。这样,可以直接模拟最后一个小球的路线,实现代码:

while((cin>>D>>I)==2)
{ int k=1;
for(int i=0;i<D-1;i++)
if(I%2){
k=k*2;
I=(I+1)/2;
}
else
{
k=k*2+1;
I/=2;
}
cout<<k<<endl;
}

最新文章

  1. hadoop-2.6.0-src源码导入Eclipse 转载
  2. 解决linux crontab PHP fgetcsv 读取中文数据为空问题
  3. Upgrade Image&amp;ntext to varbinarymax&amp;nvarchar(max)
  4. Javascript中日期函数的相关操作
  5. Deviceone:站在移动互联时代的十字路口上
  6. 2-Highcharts 3D图之3D柱状图带可调试倾斜角度
  7. HTTP协议状态码的含义
  8. FireDAC如何连接ORACLE数据库
  9. Count Complete Tree Nodes ——LeetCode
  10. url中的jsessionid解释
  11. c3p0数据源定义
  12. hibernate操作数据库总结
  13. 《CSS设计指南》阅读笔记
  14. jquery.datetimepicker.js 当鼠标离开时,不选中当前时间,以达到清空的目的
  15. [NOIp 2017]逛公园
  16. centos系统java后台运行(xshll关掉不至于jar程序结束)
  17. Java I/O输入输出流
  18. MD5状态变量,为什么是A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476这几个变量
  19. Fragment中启动一个新的Activity
  20. conEmu的使用笔记

热门文章

  1. VUE回顾基础3
  2. js事件(十二)
  3. 遍历js中的数组
  4. php通过curl发送XML数据,并获取XML数据
  5. Linux内核同步机制之completion
  6. C# DataTable 和List之间相互转换的方法(转载)
  7. sqlserver 备份集中的数据库备份与现有的 &#39;XXX&#39; 数据库不同。
  8. [JavaScript] js中全局标识正则表达式的lastIndex属性
  9. 【RocketMQ】同一个项目中,同一个topic,可以存在多个消费者么?
  10. Python的logging模块基本用法