【发布时间】:2013-11-15 21:25:51
【问题描述】:
我正在学习堆,但我无法理解你应该如何移动每个节点。我将在下面给你一个示例树:
1
/ \
2 3
/ \ / \
4 5 6 7
/ \ /
8 9 10
这就是我的树。我试图让 10 到节点,但不明白我采取的步骤。我会先看看树的底部吗?这是我的尝试:
1
/ \
2 3
/ \ / \
4 5 6 7
/ \ /
8 9 10
-> Move ten up and the two down.
1
/ \
10 3
/ \ / \
4 5 6 7
/ \ /
8 9 2
-> Move the 9 up
1
/ \
10 3
/ \ / \
9 5 6 7
/ \ /
8 4 2
-> move the 7 up
1
/ \
10 7
/ \ / \
9 5 6 3
/ \ /
8 4 2
-> Move the whole left side up and bring the 1 down.
10
/ \
9 7
/ \ / \
8 5 6 3
/ \ /
1 4 2
这就是我最终得到的结果,但我觉得这是不对的,因为它不是一棵有序的树。有人可以帮助我了解我哪里出错了吗?
【问题讨论】:
-
嗯,请参阅 en.wikipedia.org/wiki/Binary_heap ... 请注意,堆不是(必须)有序的,堆是您将树变回堆的操作,但您从一分钟开始heap ...你想把它变成一个最大堆吗?
-
是的,我正在尝试按降序排列它们
-
同样,堆不一定是有序的。您的最终结果是最大堆,因为它满足我给出的链接中的两个标准。
-
非常有趣。当我下线时,我没有违反任何规则?
-
要将堆转换为最大堆,从最后一个父级开始,将其与其较大的子级交换,然后移动到前一个父级直到到达根。
标签: c algorithm search heap binary-tree