证明二元堆具有


16

我想证明一个二元堆n节点正好有假设以下列方式构建堆,那么将保留 2片叶子:n2

通过percolate up插入每个新节点。这意味着必须在下一个可用子节点上创建每个新节点。我的意思是,孩子们从下到上,从左到右地被填充。例如,以下堆:

    0
   / \
  1   2

已建成的顺序为:0,1,2,(这些数字仅仅是索引,他们没有给出该节点所包含的实际数据的指示。)

这有两个重要含义:

  1. 没有完全填充级别k,在级别上将不存在任何节点k+1k

  2. 因为子级是从左到右构建的,所以在级别上的节点之间不能有“空白空间” ,或者类似以下情况: k+1

        0
       / \
      1   2
     / \   \
    3  4    6
    

(根据我的定义,这将是非法的堆。)因此,考虑该堆的一个好方法是堆的数组实现,其中数组的索引中不能有任何“跳转”。

因此,我认为归纳法可能是实现此目的的一种好方法……也许某些事情甚至需要处理n的奇数情况。例如,使用这样的事实进行归纳,即以这种方式构建的偶数堆必须具有一个带有偶数n的子节点的内部节点,而没有奇数n的此类节点。有想法吗?


@DaveClarke:不完全;链接的问题是对我们留给编辑的部分误解的结果。
拉斐尔

您是否尝试过归纳节点号。插入次数?
拉斐尔

@DaveClarke:为什么?恕我直言,这本身就是一个有效的问题。
拉斐尔

顺便说一句,这个问题与堆无关。该索赔适用于任何完整的二叉树
Ran

Answers:


8

如果我正确地理解了您的问题,那么获得的堆只是一个有序的二叉树,其中有序的意思是第个级别只能在k 1个级别完全填充后才能被占用,并且每个级别从左开始都被占用向右,无需跳过。kk1

然后证明就这样。

  1. 深度的完美树正好有2 ķ + 1 - 1节点。k2k+11
  2. 假设堆达到深度。从而 k
    1. 直到级,树是完美的(并且那里有2 k1个节点)k12k1
    2. n2k+1
  3. k
  4. 2k1k1n2k+122k1n2k+12
  5. n2k+1+2k1n2k+12

1
请注意,完全不同于完全不同于完全二叉树。不幸的,模棱两可的和不一致的单词选择在那里,但是你能做些什么。我想坚持Wikipedia的定义是有道理的,因为大多数人会首先看到那里?
拉斐尔

哦,哇,我什至都不知道这些术语。感谢您指出了这一点。
Ran G.

“直到k-1级为止,树都是完美的(并且那里有2 ^ k-1个节点)”,“因此,在k-1级的2 ^(k-1)个节点中,这似乎是矛盾的,还是我错过了什么?
阿德里安h。

2k12k12k1+2k2+...

啊,您完全正确,非常感谢您的澄清!
阿德里安h。

11

这是一个更简单的逻辑证明。

nthn/2n/2+1)thn/2

(n/2)(n/2)


1
相当直观清晰的说明。谢谢。
whitehat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.