二叉树数组列表表示

时间:2012-10-29 04:23:29

标签: algorithm time-complexity asymptotic-complexity

我一直在研究二叉树和数组列表表示。我很难理解最坏情况下的空间复杂度是O(2 ^ n)。具体来说,该书指出,空间使用是O(N)(N =数组大小),在最坏的情况下是O(2 ^ n)。我原本以为在最坏的情况下它会是2n,因为每个节点有两个子节点(索引)而不是O(2 ^ n),其中n = no。元素。

一个例子,如果我有一个包含7个节点的二叉树,那么空间将是2n = 14而不是2 ^ n = 128。 enter image description here

3 个答案:

答案 0 :(得分:0)

二叉树的最坏情况空间复杂度是O(n)(在你的问题中不是O(2 ^ n)),但如果它几乎是一个完整的二叉树,使用数组表示二叉树可以节省指针的空间

请参阅http://en.wikipedia.org/wiki/Binary_tree#Arrays

答案 1 :(得分:0)

这是数组上的Heap实现。其中

A[1..n]
left_child(i) = A[2*i]
right_child(i) = A[2*i+1]
parent(i) = A[floor(i/2)]

现在,来到太空。直观地思考,

当您插入第一个元素n = 1时,location = A [1],类似地,

n=2 @A[2] left_child(1)
n=3 @A[3] right_child(1)
n=4 @A[4] left_child(2)
n=5 @A[5] right_child(2)

你看,n th 元素将进入A[n]。因此空间复杂度为O(n)

当您编码时,只需插入最后插入的元素,例如A[n+1],并说它是floor((n+1)/2)的孩子。

参考:http://en.wikipedia.org/wiki/Binary_heap#Heap_implementation


堆是接近完整的树,因此树中元素的总数将为2h-1 < n <= 2h+1-1,这就是您需要的数组长度。请参阅:this

答案 2 :(得分:0)

我认为这是指将任意二进制树存储在数组表示中,通常用于完整几乎完整的二进制树,特别是在实施堆中。

在此表示中,根存储在数组中的索引0,对于索引为n的任何节点,其左右子节点存储在索引2n+1和{分别为{1}}。

如果你有一个退化树,其中没有节点有任何正确的子节点(树实际上是一个链表),那么第一个项目将存储在索引2n+2。通常,此列表的0, 1, 3, 7, 15, 31, ...项(从n开始)将存储在索引0中,因此在这种情况下,数组表示需要2n-1空间。 / p>