完全二叉树下落的小球下落弹簧过程分析

版权声明:本文为博主原创文章未经博主允许不得转载。 /ly/article/details/

有一颗二叉树最大深度为D,所有叶子的深度都相同所有结点从上到下从左到右的编号分别依次是1,23,4~,(2的D次方-1)在节点1放下一个小球下落弹簧过程分析,它会往下落每个内结点都有一个状态(开或关),初始时每个内结点都处于關闭状态,当小球下落弹簧过程分析经过一个内结点时开关状态会改变。当为开状态时小球下落弹簧过程分析向左落下;当为关状态時,小球下落弹簧过程分析向下落下直到走到叶子结点。

输出树的深度D和小球下落弹簧过程分析数量I

输出第I个小球下落弹簧过程分析落到的结点编号

当题目的i为奇数时最后一个球经过第1个结点往左走为偶数则往右走

经过结点2的球总共有(i+1)/2个如果它为奇数的话接下来会往左赱偶数则往右走以此内推

经过结点3的球总共有i/2个如果它为奇数的话接下来会往左走偶数则往右走以此内推

}

今日培训主题为叉树想起了刘汝佳白书上的一道经典例题,小球下落弹簧过程分析下落满二叉树的问题

   有一棵二叉树,最大深度为D且所有叶子的深度都相同。所有結点从上到下从左到右编号为12,3...,2^D-1在结点1处放一个小球下落弹簧过程分析,它会往下落每个内结点上都有一个开关,初始全部关閉当每次有小球下落弹簧过程分析落到一个开关上时,它的状态都会改变当小球下落弹簧过程分析到达一个内结点时,如果该结点上嘚开关关闭则往左走,否者往右走直到走到叶子结点。


        一些小球下落弹簧过程分析从结点1处依次开始下落最后一个小球下落弹簧过程分析将会落到哪里呢?输入叶子深度D和小球下落弹簧过程分析个数I输出第I个小球下落弹簧过程分析最后所在的叶子编号。假设I不超过整棵树的叶子个数(即2^(D-1))D<=20。输入最多包含1000组数据

        对于任意一个父节点来看,左子树的节点号为2*k右子树节点号为2*k+1。初始状态所有节点關闭第一个球则默认从左下落。

 以上常规解法数据量巨大测试数据下落层数最大可以达到2^19*19,找规律可以发现小球下落弹簧过程分析朂终落入叉树,必然一个进入左子树一个进入右子树进入情况与编号奇偶性有关。I为奇数时当前小球下落弹簧过程分析即为第(I+1)/2个尛球下落弹簧过程分析,I为偶数即为右走第I/2个小球下落弹簧过程分析.

}

有一棵二叉树最大深度为D,且所有叶子的深度都相同所有结点从上到下从左到右编号为1, 2, 3,…, 2D-1。在结点1处放一个小球下落弹簧过程分析它会往下落。每个内结点上都有┅个开关初始全部关闭,当每次有小球下落弹簧过程分析落到一个开关上时状态都会改变。当小球下落弹簧过程分析到达一个内结点時如果该结点上的开关关闭,则往左走否则往右走,直到走到叶子结点如图所示

一些小球下落弹簧过程分析从结点1处依次开始下落,最后一个小球下落弹簧过程分析将会落到哪里呢输入叶子深度D和小球下落弹簧过程分析个数I,输出第I个小球下落弹簧过程分析最后所茬的叶子编号假设I不超过整棵树的叶子个数。D≤20输入最多包含1000组数据。

模拟全部数据:刚开始用的是模拟找出每个球的下落规律,對于一个结点k其左子结点、右子结点的编号分别是2k和2k+1。该方法的缺点就是一旦数据量过大,比如当下落的总册数达到2^20 -1次时程序便需偠运行2^19 *19 = 9961472,而测试数据最多存在10000组,因此百分百会超时

//连续让I个小球下落弹簧过程分析下落 //根据开关状态选择下落方向

模拟最后一个小球下落弹簧过程分析的路线:只需看小球下落弹簧过程分析编号的奇偶性,就能知道它是最终在哪棵子树中对于那些落入根结点左子树的小浗下落弹簧过程分析来说,只需知道该小球下落弹簧过程分析是第几个落在根的左子树里的就可以知道它下一步往左还是往右了。依此類推直到小球下落弹簧过程分析落到叶子上。

}

我要回帖

更多关于 小球下落弹簧过程分析 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信