在Min Heap中插入节点优先考虑左子节点

时间:2017-10-29 02:51:58

标签: c heap

在获得用于在Min Heap中插入注释的代码之后,如果我想在重新排列堆时优先考虑节点的左子节点,那么我应该做出哪些更改。 输入将类似于:

I 5 //insert number 5 in the Min Heap
I 4
I 3
I 2
I 1

,输出应为:

1 2 3 4 5

而不是通常的:

1 2 4 5 3

有关如何获得此输出的任何想法?提前谢谢。

1 个答案:

答案 0 :(得分:0)

堆的结构完全取决于插入项的顺序。原因是,在插入时,将新节点添加到堆的末尾,然后通过其父指针对其进行筛选。规则是:

  1. 将项目添加到堆的末尾。
  2. 如果项目大于或等于其父项,则完成。
  3. 将项目与其父项交换。
  4. 转到2.
  5. 根据这些规则,让我们来看看当您按顺序[5,4,3,2,1]插入项目时会发生什么。

    [5]
    [5,4] // the new item is smaller than its parent, so swap
    [4,5]
    [4,5,3] // the new item is smaller than its parent, so swap
    [3,5,4]
    [3,5,4,2] // the new item is smaller than its parent, so swap
    [3,2,4,5] // still smaller than its parent
    [2,3,4,5]
    [2,3,4,5,1] // 1 is smaller than 3, so swap
    [2,1,4,5,3] // 1 is smaller than 2, so swap
    [1,2,4,5,3]
    

    没有有效的方法来“优先化”特定的子树,特别是在二进制堆中。在只有五个项目的堆中看起来很简单,但是添加的每个级别都会增加使兄弟节点保持正确顺序的成本。你最好只是对节点进行排序并从结果数组中创建一个堆。

    不是排序堆对你有多大帮助。删除第一个项目后,重新排列堆将导致它不再被排序。