我下周会进行期中考试,并且很难抽出二进制堆。最小二进制堆的不变量是:存储在父节点处的项的值始终小于(大于)存储在其子节点处的项的值。我不理解的部分是当我将值插入堆中时,我如何知道是向左还是向右?我真的很想看到一步一步的解决方案,因为我不知道如何知道是向左还是向右。
说我有值:5,8,13,15,1,2,12,4 它会像
一样开始 5 then I insert 8
/ \
8? 13? is this going in the right direction?
我知道对于二元搜索树,保留了不变量<父母<对, 但我真的很困惑如何确定是向左还是向右。
答案 0 :(得分:1)
您可以选择方向以确保基础树是完整的二叉树:
complete binary tree是一个二叉树,其中除了可能是最后一个级别之外,每个级别都被完全填充,并且所有节点都尽可能地离开
让我们将涓流方法应用于一个例子。假设您要将新元素e
添加到堆中。如果堆看起来像这样:
5 5
/ \ / \
6 9 add as right-child--> 6 9 then trickle-up
/ \ / \ to complete the / \ / \
7 tree 7 e
然后将新元素添加为6
的右子元素并进行涓流处理(即重复地将新元素与其父元素交换,直到恢复堆不变量为止)。
另一方面,如果堆看起来像这样:
5 5
/ \ / \
6 9 add as left-child --> 6 9 then trickle-up
/ \ / \ to complete the / \ / \
7 10 tree 7 10 e
然后你将最新的元素添加为9
的左子元素并涓涓细流。
至于你的例子,添加序列是5,8,13,15,1,2,12,4。以下代码片段逐步显示插入/涓流:
Add 5:
5
No change due to trickle, So add 8:
5
/
8
No change due to trickle-up. So, add 13:
5
/ \
8 13
No change due to trickle-up. So, add 15:
5
/ \
8 13
/
15
No change due to trickle-up. So, add 1:
5
/ \
8 13
/ \
15 1
Then trickle-up:
1
/ \
5 13
/ \
15 8
Next, add 2:
1
/ \
5 13
/ \ /
15 8 2
Then trickle-up
1
/ \
5 2
/ \ /
15 8 13
Next, add 12:
1
/ \
5 2
/ \ / \
15 8 13 12
No change due to trickle-up. So, add 4:
1
/ \
5 2
/ \ / \
15 8 13 12
/
4
Then trickle-up:
1
/ \
4 2
/ \ / \
5 8 13 12
/
15