假设我们有一棵树。关于这棵树的特殊属性是它已正确编号,但采用了独特的方式。树的根编号为1,后跟2个孩子,分别编号为2和3。然后2有3个孩子,即4、5、6。数字3也有3个孩子,即7、8、9。在下一级包含4、5、6、7、8、9的每个人都有2个孩子。因此,基本上,孩子的数量根据每个级别的均等保持交替。如果级别为奇数,则所有数字将有2个孩子,否则为3个孩子。您将得到一个数字n <= 10 ^ 18,并且必须打印从根到数字本身的整个路径。
示例测试用例:
假设n = 2,那么路径将为1、2
假设n = 6,那么路径将是1、2、6
假设n = 16,则路径将为1、3、7、16
答案 0 :(得分:0)
这是我的解决方法:
首先,您需要找到n的水平以及该水平的(最小,最大)值
例如:n = 2 =>等级= 2,最小,最大=(2,3)
或者如果n = 5 =>等级= 3,最小,最大=(4,9)
while max < x:
min = max + 1
if level % 2 == 1: # odd
n *= 2
max += n
else: # even
n *= 3
max += n
level += 1
然后我们将该级别中的所有数字分成2或3对成对出现的水平(成对= 3表示奇数级,成对= 2表示偶数级),并找到具有n < / p>
pos = ceil( (x - min + 1) / pair )
使用这两个公式,我们可以编写一个返回数组(最小,最大,水平,对)的函数
然后我们可以使用以下方法找到n的父级:
a = f(n)
b = f(a[0] - 1)
parent = b[0] + a[3] - 1
如果n = 16,则父级= 7
您需要做的就是继续使用父级查找n的另一个父级,直到达到1