Algorithm 如何证明子节点';堆的s公式:节点i-th有2个子节点是2i-th和2i+;第1名?
很容易看出公式是正确的,但我不知道如何证明这一点。其他一些树怎么样,比如:每个节点有3个子节点的树,4个子节点的树?Algorithm 如何证明子节点';堆的s公式:节点i-th有2个子节点是2i-th和2i+;第1名?,algorithm,tree,binary-tree,heap,Algorithm,Tree,Binary Tree,Heap,很容易看出公式是正确的,但我不知道如何证明这一点。其他一些树怎么样,比如:每个节点有3个子节点的树,4个子节点的树? 谢谢 它更像是一个定义,而不是一个证明:你这样定义它,然后处理它,同时确保你保持在你定义的不变量的范围内。您可能想证明没有重叠,但这很容易看出 对于3个孩子,我们可以使用3i、3i+1、3i+2: 1 / | \ 2 3 4 -- | \ \ 5 6 7 index:
谢谢 它更像是一个定义,而不是一个证明:你这样定义它,然后处理它,同时确保你保持在你定义的不变量的范围内。您可能想证明没有重叠,但这很容易看出 对于3个孩子,我们可以使用
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
但是,正如您所看到的,这会变得相当低效。如果你能负担得起内存的话,它可能比使用指针更快,但否则它就没有多大用处了 您必须证明,如果您按级别顺序遍历一个完整的二叉树,您将始终在
2n
th和2n+1
th次访问您在n
th次访问的节点的子节点
我们可以通过归纳法来做到这一点。证明基本情况无关紧要:
1
/ \
2 3
现在,我们必须证明,如果对某些n
是真的,那么对n+1
也是真的:
如果我们在2n
和2n+1
时间内访问n
的孩子,则n+1
的孩子将紧挨着他们,在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
的子级将始终是邻居,因为执行级别顺序的方式(访问节点并将子级添加到队列中)。尝试通过归纳证明。。。