如何创建堆?

时间:2011-06-26 03:54:07

标签: data-structures heap

假设我有一个堆如下:

     77
    /  \
   /    \
  50    60
 / \    / \
22 30  44 55

现在,我想在此堆中插入另一个项目55。

怎么做?

选项1。

         77
        /  \
       /    \
      55    60
     / \    / \
    50 30  44 55
   /
  22

选项2。

     77
    /  \
   /    \
  55    60
 / \    / \
22 50  44 55
     \
     30

选项3。

     77
    /  \
   /    \
  50    60
 / \    / \
22 30  55 55
      /
     44

哪一步是正确的? Why?请解释一下。

3 个答案:

答案 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

我希望这很有用。