将值插入二进制堆(构建时)背后的逻辑是什么?
What is the logic behind inserting values into binary heaps (when build one)?
我下周有期中考试,我很难画出二叉堆。最小二叉堆的不变量是:存储在父节点的项的值总是小于(大于)存储在其子节点的项的值。我不明白的部分是当我向堆中插入值时,我怎么知道是向左还是向右?我真的很想看到一步一步的解决方案,因为我只是不明白我怎么知道是向左走还是向右走。
假设我有以下值:5、8、13、15、1、2、12、4
它会像
一样开始
5 then I insert 8
/ \
8? 13? is this going in the right direction?
我知道二叉搜索树的不变量是左<父<右,
但我真的很困惑如何确定是向左还是向右。
你选择的方向保证底层树是完全二叉树:
A complete binary tree is a binary tree in which every level, except possibly the last, is completely filled, and all nodes are as far left as possible
让我们将涓流方法应用到一个例子中。假设您要向堆中添加一个新元素 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。以下代码片段显示了 insert/trickle-up 分步操作:
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
我下周有期中考试,我很难画出二叉堆。最小二叉堆的不变量是:存储在父节点的项的值总是小于(大于)存储在其子节点的项的值。我不明白的部分是当我向堆中插入值时,我怎么知道是向左还是向右?我真的很想看到一步一步的解决方案,因为我只是不明白我怎么知道是向左走还是向右走。
假设我有以下值:5、8、13、15、1、2、12、4 它会像
一样开始 5 then I insert 8
/ \
8? 13? is this going in the right direction?
我知道二叉搜索树的不变量是左<父<右, 但我真的很困惑如何确定是向左还是向右。
你选择的方向保证底层树是完全二叉树:
A complete binary tree is a binary tree in which every level, except possibly the last, is completely filled, and all nodes are as far left as possible
让我们将涓流方法应用到一个例子中。假设您要向堆中添加一个新元素 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。以下代码片段显示了 insert/trickle-up 分步操作:
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