在获得用于在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
有关如何获得此输出的任何想法?提前谢谢。
答案 0 :(得分:0)
堆的结构完全取决于插入项的顺序。原因是,在插入时,将新节点添加到堆的末尾,然后通过其父指针对其进行筛选。规则是:
根据这些规则,让我们来看看当您按顺序[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]
没有有效的方法来“优先化”特定的子树,特别是在二进制堆中。在只有五个项目的堆中看起来很简单,但是添加的每个级别都会增加使兄弟节点保持正确顺序的成本。你最好只是对节点进行排序并从结果数组中创建一个堆。
不是排序堆对你有多大帮助。删除第一个项目后,重新排列堆将导致它不再被排序。