Data structures 如何在阵列中存储树状树?

Data structures 如何在阵列中存储树状树?,data-structures,Data Structures,我希望将树存储在数组中,同时能够从当前索引轻松计算父索引和子索引,就像在二进制堆中一样。该树只有一个根节点,位于级别0。树有N个级别,级别i的每个节点都有N(i)个子节点 这能做到吗?怎么做 编辑: 澄清:您可以在单个数组中存储(完整的)二叉树,即存储堆,而无需显式存储索引。Root位于0,位置i的节点的子节点位于2i+1和2i+2。因此,您可以从父节点的索引计算子节点,而无需实际存储索引。数据结构隐含在数据中,请参见 我的问题:你能把它推广到更一般的树上吗,如上所述 如果我理解你想说的话(级别

我希望将树存储在数组中,同时能够从当前索引轻松计算父索引和子索引,就像在二进制堆中一样。该树只有一个根节点,位于级别0。树有N个级别,级别i的每个节点都有N(i)个子节点

这能做到吗?怎么做

编辑:

澄清:您可以在单个数组中存储(完整的)二叉树,即存储堆,而无需显式存储索引。Root位于0,位置i的节点的子节点位于2i+1和2i+2。因此,您可以从父节点的索引计算子节点,而无需实际存储索引。数据结构隐含在数据中,请参见


我的问题:你能把它推广到更一般的树上吗,如上所述

如果我理解你想说的话(级别I的每个节点都有n(I)个子节点),那么很简单:第一个数字是由n(0)个元素(这些元素是根的子节点)休耕的根,然后你为所有这些n(0)个节点放置它们的所有n(1)个节点。 如果你有n(0)=3,那么第一次你放n(1)个点头,第二次点头之后你放所有n(1)个点头,第三次点头之后放n(1)个点头

1 -> 2, 5, 3 ( 1 is the root, and has 2, 5, 3 as children)
2 -> 4, 10
3 -> 45, 35
5-> 12, 31
n(0) = 3, n(1) = 2 , n(2) = 0
Then You should have: {1,  2, 5, 3,  4, 10,   45, 35,  12, 31}
对于一个好的索引,您应该保留另一个带有父索引位置的数组,另一个带有第一个子索引,或者如果您真的希望只保留一个数组,您应该这样做:
对于每个元素,保留3项内容:父索引和第一个子索引。 因为孩子是一个接一个的,所以你总是可以接触到所有的孩子 你永远都会有父亲。(我会为根的父亲写-1) 那么你应该:

{1,-1, 3,   2, 0,12,   5, 0, x,    3, 0,  x,     4,  3,  x,  ... } 
{0, 1, 2,   3, 4, 5,   6, 7, 8,    9, 10, 11,    12, 13, 14, ... }
-1 is the father of 1 and 3 is the start of his child
0 is the father of 1 and 12 is the start of his child ( 4 in this case)

如果您想要一个“堆”结构,您必须找到最大数量的子项Mx=(max(n(i)),1您所寻找的可能与简洁的数据结构有关,即使用接近信息论最小位数的数据结构表示法。我不知道有任何此类表示法,但我想知道它们是否存在。谢谢。问题是,我希望避免“存储”父索引和子索引,而不是从当前索引计算。将编辑问题以澄清。@willem看看这是否是您想要的(最后一段)