假设我有一个堆如下:
77
/ \
/ \
50 60
/ \ / \
22 30 44 55
现在,我想在此堆中插入另一个项目55。
怎么做?
77
/ \
/ \
55 60
/ \ / \
50 30 44 55
/
22
77
/ \
/ \
55 60
/ \ / \
22 50 44 55
\
30
77
/ \
/ \
50 60
/ \ / \
22 30 55 55
/
44
哪一步是正确的? Why
?请解释一下。
答案 0 :(得分:9)
选项1是对的.. 因为我们开始从最左边的节点添加子节点,如果父节点低于新添加的子节点,则替换它们。并且像这样继续,直到孩子得到父母的价值大于它。
您的初始树
77
/ \
/ \
50 60
/ \ / \
22 30 44 55
现在根据大多数左侧的规则添加55.
77
/ \
/ \
50 60
/ \ / \
22 30 44 55
/
55
但你看到22低于55因此取而代之。
77
/ \
/ \
50 60
/ \ / \
55 30 44 55
/
22
现在55岁已成为50岁的孩子,仍然低于55岁,所以也要替换它们。
77
/ \
/ \
55 60
/ \ / \
50 30 44 55
/
22
现在它不能排序更多因为77大于55 ... 所以你的选择1是对的。
here你可以详细看到堆排序示例.. This link states 堆是一种专门的基于树的数据结构,它满足堆属性:如果B是A的子节点,则键(A)≥键(B)。这意味着具有最大密钥的元素始终位于根节点中,因此这样的堆有时称为最大堆。 (或者,如果比较相反,最小元素总是在根节点中,这会产生最小堆。)对于每个节点在堆中有多少个子节点没有限制,尽管实际上每个节点都有最多两个。
祝你好运
答案 1 :(得分:3)
选项1,根据定义,二进制堆的形状是一个完整的二叉树。另外2个不是完整的二叉树。 见http://en.wikipedia.org/wiki/Binary_heap
答案 2 :(得分:1)
正确的选项是1.
为什么?
请记住,堆的一个属性是一个完整的二叉树,即它们的所有级别,除了可能是最后一个,都是完全填充的,并且所有节点都尽可能地离开...维基百科?
在选项2和3中,元素未尽可能向左插入,因此完整二叉树的属性被破坏。
关于元素的最终位置是通过将插入的元素(儿子)与他们的直接祖先(父亲)交换,而儿子比父亲少。
77
/ \
/ \
50 60
/ \ / \
22 30 44 55
77
/ \
/ \
50 60
/ \ / \
22 30 44 55
/
55
77
/ \
/ \
50 60
/ \ / \
55 30 44 55
/
22
77
/ \
/ \
55 60
/ \ / \
50 30 44 55
/
22
我希望这很有用。