通往树中根节点的路径是什么?

时间:2019-06-18 05:58:38

标签: algorithm math data-structures pattern-matching

假设我们有一棵树。关于这棵树的特殊属性是它已正确编号,但采用了独特的方式。树的根编号为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

1 个答案:

答案 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