我想在一个数组中存储一个树,同时能够轻松地从当前索引计算父子索引,就像在二进制堆中一样。树具有单个根节点,其为0级。树具有N个级别,级别i的每个节点具有n(i)个子节点。
可以这样做吗?怎么样?
编辑:
澄清:您可以将(完整的)二叉树存储在单个数组中,即存储堆,而无需显式存储索引。 Root为0,位置i的节点的子节点为2i + 1和2i + 2。因此,您可以从父节点的索引计算子项,而无需实际存储索引。数据中的数据结构是隐式,请参阅http://en.wikipedia.org/wiki/Binary_heap#Heap_implementation
我的问题:如上所述,您能否将其概括为更一般的树。
答案 0 :(得分:2)
如果我理解你想说的话(i级的每个节点都有n(i)个孩子)那么很简单:第一个数字是n(0)个元素的根,它们是root的子节点,然后你为所有那些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个东西:父索引和第一个子索引。
因为孩子是一个接一个,所以你总是可以接触到所有的孩子
你会永远拥有父亲。 (我会为root的父亲写-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< = i< = N并用步骤MX做一堆,每个元素都有他们的孩子在pos * MX,pos * MX + 1,.. pos * MX + n(k),父亲在pos / MX,其中pos是节点的索引。
你将拥有大量的自由空间,但却是一堆堆积的结构
我希望它可以帮助你。