我发现如本文on HackerEarth 中所解释的那样,可以使用数组来实现分段树,其中位于array-index n 的节点的子元素位于索引 2n 和 2n + 1 。
此外,它还指出,为了在我的段树中存储 n 元素,我需要 2n + 1 节点。
然而,最近当我解决了与段树相关的几个问题时,有时候我的代码给出了运行时错误,当我将用于存储段树的数组大小更改为 4 x(要存储在段中的数组的大小)时,该错误得到了解决树)。我怎样才能确定一个分段树实际上需要nn个元素的4n大小的数组。
答案 0 :(得分:2)
2N + 1 节点使用给定的方式来定位子节点,如果N小于2的幂(或者如果树是平衡的并且丢失的叶节点都在在底行的右侧,类似于文章中的第一个树图)。否则,将节点的索引加倍以获取其子节点将超过数组的边界。查看文章中的中间图(顶部节点中带有“36”的树)。 “16”节点将具有索引6,因此其子节点将位于节点12和13处。节点“5”没有任何子节点(应该在节点10和11中)。这些丢失的节点仍然需要在阵列中有插槽。
答案 1 :(得分:2)
如果你擅长俄语,请阅读这篇文章:http://e-maxx.ru/algo/segment_tree
如果你不是,我将描述它说的内容:我们需要注意,你使用这样的枚举(包含{{1的子项)包含段树的数组的大小} {是i
而右子是2i
),不是2i+1
,而是2n
。问题是:当4n
不是2的幂时,这个枚举并不完全正常 - 在这种情况下我们得到"跳过"数字,未分配给任何树顶点(它们表示"节点")。实际上,它就好像我们将n
舍入到最接近2的幂。它不会使实现更复杂,但迫使我们将数组的大小增加到n
。