问题1
98
/ \
/ \
67 89
/ \ / \
/ \ / \
38 42 54 89
/ \
/ \
17 25
我想将97插入最大堆[98,67,89,38,42,54,89,17,25](在列表中表示)。
据我所知,产生的堆是[98,97,89,38,67,54,89,17,25,42]
98
/ \
/ \
97 89
/ \ / \
/ \ / \
38 67 54 89
/ \ |
/ \ |
17 25 42
问题2
我想将delete_max()两次应用到堆[100,97,93,38,67,54,93,17,25,42]。
100
/ \
/ \
97 93
/ \ / \
/ \ / \
38 67 54 93
/ \ |
/ \ |
17 25 42
根据我的堆,在两次deletemax操作之后,得到的堆是[93,67,93,38,42,54,25,17]
93
/ \
/ \
67 93
/ \ / \
/ \ / \
38 42 54 25
/
/
17
我想要遵守,我正在为堆正确插入和max_delete以及上面的答案是否正确? 如果不正确,请指导我。
答案 0 :(得分:0)
答案 1 :(得分:0)
你的答案看起来是正确的。让我们仔细看看为什么。
在第一种情况下,你有堆:
[98,67,89,38,42,54,89,17,25]
你想插入97.所以你把它添加到最后然后冒泡它:
[98,67,89,38,42,54,89,17,25,97]
您将97与其父级(42)进行比较。由于97更大,你可以交换它们:
[98,67,89,38,97,54,89,17,25,42]
然后再次将97与其父级进行比较。这次父母是67,所以你必须再次交换。
[98,97,89,38,67,54,89,17,25,42]
再一次比较,您会看到父(98)大于您插入的项目,因此您已完成。
现在,给定堆[100,97,93,38,67,54,93,17,25,42]
,您想删除两个最高项。 delete_max的规则是将root替换为堆上的最后一项,然后将其筛选出来。所以你有:
[42,97,93,38,67,54,93,17,25]
42小于其子女,因此您将其与最大的孩子交换:
[97,42,93,38,67,54,93,17,25]
它大于38,但小于67,所以你再次交换:
[97,67,93,38,42,54,93,17,25]
42现在处于叶级,因此无处可做。这是第一个删除的项目。现在删除第二个。将25移动到根目录:
[25,67,93,38,42,54,93,17]
然后筛选:
[93,67,25,38,42,54,93,17] // swapped with 93
[93,67,93,38,42,54,25,17] // swapped with 93 again