【问题标题】:Path in a Tree with Indexed Leaves带索引叶子的树中的路径
【发布时间】:2019-07-31 03:49:59
【问题描述】:

我试图弄清楚如何在树中生成路径,其中节点标记为(position relative to parent,height),叶子从 0 开始索引。现在我遍历整个树,这可能是一种愚蠢的做法。例如下面树中叶子2的路径是:root/(1,1)/(0,0)

            root
           /   \
        (0,1) (1,1)
         / \   /  \
        0   1  2   3

我知道如何获取路径中的最后一项:(叶子索引 % 分支率,0)。但现在我被困在如何走完剩下的路。必须有一种不遍历整个树的方法吗?

【问题讨论】:

  • 还有其他关于树的信息吗,比如它是否完整?您给出的示例是一个完美树(以及完整)。在您的“我知道如何获取” 公式中,您似乎假设这棵树至少是完整的。这是给定的吗?
  • 是的,我应该提到它是一棵完美的树。你的答案很完美,谢谢!

标签: algorithm tree


【解决方案1】:

如果您的树是 perfect m-ary tree,那么您可以重复使用已为叶子找到的公式。

我们需要知道的树:

  • m:分支因子,即所有内部节点拥有的子节点数。
  • h:树的高度,即根节点的高度。

k 是叶子的从零开始的索引,以找到其路径。那么路径是:

[
    root,
    ((k / m^(h-1)) % m, h-1),
    ((k / m^(h-2)) % m, h-2),
    ...
    ((k / m^2    ) % m, 2  ),
    ((k / m      ) % m, 1  ),
    (k             % m, 0  )
]

... 其中除法 (/) 是整数除法,插入符号 (^) 是指数。

所以在伪代码中,你会这样做(再次使用整数除法和求幂):

get_path(m, h, k):
    path = ["root"]
    denom = m^h
    while h > 0:
        h = h - 1
        denom = denom / h
        path.append( ((k / denom) % m, h) )
    return path

反过来可能会容易一些:

get_path(m, h, k):
    path = []
    for height = 0 to h-1:
        path.append( (k % m, height) )
        k = k / m
    path.append("root")
    return reversed(path)

【讨论】:

    猜你喜欢
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 2018-06-11
    • 2011-10-31
    相关资源
    最近更新 更多