【问题标题】:Compute index for leafs in a tree structure计算树结构中叶子的索引
【发布时间】:2012-03-27 18:52:03
【问题描述】:

给定一个深度为 N 的树(二进制)结构。是否可以计算一些查找索引来映射叶节点。

每个节点都知道它的父节点,如果它不是叶子节点,它也知道它的子节点(左和右)。

我的想法就像说 rootnode 是索引 0,然后 left:1,left:left:2, left:left:left:3, left:left:right:4, left:right:left:5,left :right:right:6,right:7,right:left:8 例如

所以给定一个叶节点,我怎样才能最聪明地计算索引。

也可以接受其他解决方案,如果它更聪明地给出从 0,1...L 开始的叶子索引,其中 L 是叶子的数量。

【问题讨论】:

    标签: c++ data-structures binary-tree


    【解决方案1】:

    在我的树结构(四叉树和八叉树)中,我使用每个节点索引的二进制表示。例如每个维度 32 位(最多 32 级)。 所以我可以通过公式计算叶子的完整索引(或路径)

    path.x = (unsigned int)(leaf.position.x * pow(2,32));

    leaf.position.x 必须在 0...1 的范围内

    此方法的唯一限制(我认为)是您存储的数据必须在特定范围内,以便您可以根据您的区域大小对其进行划分。 如果这对您的用例可行,请阅读更多信息 Simple and Efficient Traversal Methods for Quadtrees and Octrees

    【讨论】:

    • 我确实想过为路径使用位,但我的树比 32 位要深一些。现在我只是通过先左后右迭代计算索引,并在到达新叶子时给它们索引++。
    【解决方案2】:

    如果你想在一个数组中表示一棵树,最简单的方法是一次取一层树。

          0
         / \
        /   \
       1     2       [0, 1, 2, 3, 4, 5, 6]
      / \   / \
     3   4 5   6
    

    这样,找到父节点很简单:(index-1)/2。而找到两个孩子只是2*index2*index + 1

    【讨论】:

    • 我的树是在外部库中生成的。它这样做是递归的,从左到右计算。然后我想计算一个映射以更快地找到叶节点。所以当传递一个叶节点时,我需要通过询问它的父节点来找到它的索引。我想这样做是因为在节点父节点上迭代 N 步比在树中的所有节点上迭代以找到节点更快。原因是我需要存储一些链接到叶节点的附加信息,我无法扩展类。
    • 谢谢,我需要这样的想法
    猜你喜欢
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    相关资源
    最近更新 更多