我一直在研究二叉树和数组列表表示。我很难理解最坏情况下的空间复杂度是O(2 ^ n)。具体来说,该书指出,空间使用是O(N)(N =数组大小),在最坏的情况下是O(2 ^ n)。我原本以为在最坏的情况下它会是2n,因为每个节点有两个子节点(索引)而不是O(2 ^ n),其中n = no。元素。
一个例子,如果我有一个包含7个节点的二叉树,那么空间将是2n = 14而不是2 ^ n = 128。
答案 0 :(得分:0)
二叉树的最坏情况空间复杂度是O(n)(在你的问题中不是O(2 ^ n)),但如果它几乎是一个完整的二叉树,使用数组表示二叉树可以节省指针的空间
答案 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>