2013-08-06 44 views
0

我正在爲我的決賽進行學習,並且不確定是否正確插入值6, 7, 57, 54, 96, 3, 9, 4, 2, 8, 32。我結束了一個樹看起來像:我是否正確插入最大堆?

         96 
           / \ 
            57  9 
           /\ /\ 
           6 54 3 7 
          /\/\ 
           4 2 8 32 

誰能告訴我,如果這是正確的,或者如果它沒有指出在那裏我搞砸了?謝謝!

+1

你總是在堆的末尾添加新的元素,然後調用heapify (或在這裏'maxHeapify()') –

回答

2

這是正確的。無論如何,你爲什麼認爲你搞砸了?

+0

我總是懷疑我做了什麼,並希望得到它的雙重檢查,以確保我瞭解算法的工作原理。 – user123

1

是你的解決方案是正確的

只要你在代表二進制堆列表的末尾添加新的元素,然後應用heapify該元素上。

Heapify應該比較元素與其父',如果它更大,它應該交換這些元素,並繼續前進,直到你到達根。

這裏有一些階段:

6  -->    7  --> 57 
         /   /\ 
         6    6 7 

這裏是一個java例如:

public class BinaryMinHeap { 



    public void insert(int value) { 
       if (heapSize == data.length) 
         throw new HeapException("Heap's underlying storage is overflow"); 
       else { 
         heapSize++; 
         data[heapSize - 1] = value; 
         heapify(heapSize - 1); 
       } 
      }  

      … 

    private void heapify(int nodeIndex) { 
       int parentIndex, tmp; 
       if (nodeIndex != 0) { 
         parentIndex = getParentIndex(nodeIndex); 
         if (data[parentIndex] < data[nodeIndex]) { 
          tmp = data[parentIndex]; 
          data[parentIndex] = data[nodeIndex]; 
          data[nodeIndex] = tmp; 
          heapify(parentIndex); 
         } 
       } 
      } 
    } 

代碼源:here