将值插入二进制堆(构建一个)时的逻辑是什么?

时间:2016-04-18 02:02:36

标签: tree heap binary-heap

我下周会进行期中考试,并且很难抽出二进制堆。最小二进制堆的不变量是:存储在父节点处的项的值始终小于(大于)存储在其子节点处的项的值。我不理解的部分是当我将值插入堆中时,我如何知道是向左还是向右?我真的很想看到一步一步的解决方案,因为我不知道如何知道是向左还是向右。

说我有值:5,8,13,15,1,2,12,4 它会像

一样开始
  5 then I insert 8
 / \ 
8? 13? is this going in the right direction?

我知道对于二元搜索树,保留了不变量<父母<对, 但我真的很困惑如何确定是向左还是向右。

1 个答案:

答案 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