将树展平为数组

时间:2013-08-28 13:01:20

标签: c arrays tree

我正在寻找将树放入数组的最佳方法

我们的想法是遵循这一原则:Array Implementation of Trees 但我坚持如何知道哪些节点是子节点以及哪些节点处于同一级别,因为我没有使用二叉树。

我可能要存储ASCII但我不能简单地允许256个指针的数组!

任何想法都会受到欢迎。

这样做的目的是将数组(树)发送到我的GPU,而不是使用结构。

2 个答案:

答案 0 :(得分:0)

嗯,这是我对converting tree into an array的想法。

获取大小为MAX_VAL的数组,该数组是树中的节点总数。数组的类型应与节点的类型相同,但有一个额外的字段。它是其父级的索引值。您以这种方式存储每个节点。将根节点存储在第一个位置。说1。现在,此节点的子节点随后存储有存储1的额外字段(因为这是存储根的位置)。

在所有节点上应用此过程,您就完成了。您可以通过在每个节点上进行简单的递归调用来获取树。

希望这会有所帮助。 :):)

答案 1 :(得分:0)

Ahnentafel列表非常大,如果不是非常完美平衡的话。我的猜测是你的树不会平衡,所以隐含的父/子指针的好处将超过成本。我从未见过非二元Ahnentafel列表,但我认为它是可能的(你是否要求隐式方程式?)。

你能保留每个节点的子指针排序列表(ASCII字符+指针/索引)吗?在这种情况下,正如其他人所建议的那样,使用指针构建树并允许孩子成长可能是最好的。然后将所有节点打包到一个列表中:计算出放置节点的顺序,使用前缀和为数组中的偏移量,在每个节点上存储位置索引,最后将子列表复制到数组中(用子节点替换子节点)列表索引可以通过跟随指针并查询上一步中的索引来完成。

在CUDA中遍历一个孩子不会是恒定的时间,但是因为知道了这个顺序,所以你可以使用二进制搜索来加快速度。