题目:
有一棵二叉树,最大深度为D,且所有叶子的深度都相同。所有结点从上到下从左到右 编号为1, 2, 3,…, 2D-1。在结点1处放一个小球,它会往下落。每个内结点上都有一个开关, 初始全部关闭,当每次有小球落到一个开关上时,状态都会改变。当小球到达一个内结点 时,如果该结点上的开关关闭,则往左走,否则往右走,直到走到叶子结点。 一些小球从结点1处依次开始下落,最后一个小球将会落到哪里呢?输入叶子深度D和 小球个数I,输出第I个小球最后所在的叶子编号。假设I不超过整棵树的叶子个数。D≤20。 输入最多包含1000组数据。
暴力模拟不可取,10000组数据肯定超时,考虑下推导规律.从第一个小球看,肯定一直往左移动,第二个肯定一直往右移动.看来小球下落的方向与它经过该节点的次数(I)奇偶性有关,奇数一定往左落,偶数往右落,而最后一个小球下落的叶子编号与前面的小球无关(?)
得出核心代码.
for(i=0;i<depth-1;i++){
if(I%2) { I=(I+1)/2;k*=2;
} else { I/=2;;k=2*k+1
;}
另外:
1.内部结点是指除了叶结点以外的结点.
2.当暴力行不通时,尝试找规律(数学,dp)。优化优化再优化.