如何证明 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第 2n
和 2n+1
次。
我们可以通过归纳来做到这一点。证明基本情况很简单:
1
/ \
2 3
现在,我们必须证明如果它对某些 n
是正确的,它对 n+1
也是正确的:
如果你在2n
和2n+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
图像只是一个例子,n
和n+1
可能处于不同的层次。这没问题。 n
和 n+1
的 children 将始终是邻居,因为 level-order 的实现方式(访问节点并将 children 添加到队列)。
很容易看出公式是正确的,但我不知道如何证明这一点。其他一些树怎么样:每个节点有 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第 2n
和 2n+1
次。
我们可以通过归纳来做到这一点。证明基本情况很简单:
1
/ \
2 3
现在,我们必须证明如果它对某些 n
是正确的,它对 n+1
也是正确的:
如果你在2n
和2n+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
图像只是一个例子,n
和n+1
可能处于不同的层次。这没问题。 n
和 n+1
的 children 将始终是邻居,因为 level-order 的实现方式(访问节点并将 children 添加到队列)。