如何证明 child 节点的堆公式:节点 i-th 有 2 child 是 2i-th 和 2i+1-th?

How to prove the child node' s formular of heap: node i-th have 2 child are 2i-th and 2i+1-th?

很容易看出公式是正确的,但我不知道如何证明这一点。其他一些树怎么样:每个节点有 3 child, 4 child... 的树? 谢谢!

它更像是一个定义而不是一个证明:你将它定义为那样,然后你使用它,同时确保你保持在你定义的不变量的范围内。您可能想证明没有重叠,但这很容易看出来。

对于 3 children,我们可以使用 3i, 3i+1, 3i+2:

          1
        / | \
       2  3  4 --
             | \  \
             5  6  7

index: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 
label: - - 2 3 4 - - - - -  -  5  6  7 

但是,如您所见,这变得相当低效。如果你能负担得起内存,它可能会比使用指针更快,但否则它不会有太大用处。

你必须证明,如果你在 level-order 中遍历一个完整的二叉树,你将总是访问你在 n 次访问的节点的 children第 2n2n+1 次。

我们可以通过归纳来做到这一点。证明基本情况很简单:

   1
 /   \
2     3

现在,我们必须证明如果它对某些 n 是正确的,它对 n+1 也是正确的:

如果你在2n2n+1的时候访问n的children,那么n+1的children就对了在他们旁边,在 2n+2 = 2(n+1)2n+3 = 2(n+1)+1 期间被访问。

Q.E.D.

          .
          .
          .

    n          n+1
  /   \       /   \
2n   2n+1  2n+2   2n+3

图像只是一个例子,nn+1可能处于不同的层次。这没问题。 nn+1 的 children 将始终是邻居,因为 level-order 的实现方式(访问节点并将 children 添加到队列)。