我们经常在算法中需要树,然后我会找到一个有很多指针和递归的树 有时我需要更高的速度,我把树放入2D数组中,如下所示:
Example of a binary tree stored in an array
+-----------------+
|0eeeeeeeeeeeeeeee| //no pointers needed, parent/child, is y dimension,
|11 dddddddd| //sibbling is x dimension of the array.
|2222 cccc| //The 123 tree is stored root up.
|33333333 bb| //Notice how the abc-tree is stored upside down
|4444444444444444a| //The wasted space in the middle, is offset by the fact
+-----------------+ //that you do not need up, down, and sibbling pointers.
我喜欢这种结构,因为它允许我加速使用指针和递归时我没有的选项。
但请注意中间浪费的空间......
如何摆脱/重用浪费的空间?
要求
如果我需要最后一点速度,我只使用这种结构,所以一个包含大量翻译和地址计算的解决方案到达那个空间将没有用。
答案 0 :(得分:12)
二进制树可以更有效地存储在数组中,如下所述:http://en.wikipedia.org/wiki/Binary_tree#Arrays:
来自维基百科:
在这种紧凑的安排中,如果节点具有索引
i
,则其子节点位于索引(2i + 1)
(对于左子节点)和(2i + 2)
(对于右侧),而其父(如果有的话)在索引floor((i-1)/2)
处找到(假设根的索引为零)。此方法受益于更紧凑的存储和更好的参考局部性,特别是在前序遍历期间。但是,对于具有
(2H - n)
个节点的高度为H
的树,增长成本很高并且浪费的空间与n
成比例。
换句话说,如果你的树不是一个完整的二叉树,它将浪费空间,但它仍然比普通的二维数组更紧凑。