問題一解決:
* 第一種狀況
首先考慮while循環,result爲8,他是左孩子,因此不進入while循環,接着往下,他不是根結點,他不是父結點的右孩子,因此result爲父結點5,即返回的插入結點的雙親。
* 第二種狀況
result爲0,雙親結點的左孩子爲-2,因此進入while循環,result爲3,接下來進入if語句,他不是根結點,並且父結點的右孩子(1)不爲空,因此返回的插入結點的雙親結點是1
* 第三種狀況
while循環中,result(2)不是左孩子,因此result爲雙親結點1,往下,他是根結點,並且左子樹不爲空,result爲左孩子0.這種狀況就至關於滿樹時插入到新一層的左邊位置。html
private HeapNode<T> getNextParentAdd() { HeapNode<T> result = lastNode;// 當前的空白結點 while ((result != root) && (result.getParent().getLeft() != result))//若是當前不是一個滿堆,他不是左孩子 result = result.getParent(); if (result != root) { // /不是一個滿堆 if (result.getParent().getRight() == null)//右邊是空位 result = result.getParent(); else {//右邊不空 result = (HeapNode<T>) result.getParent().getRight(); // 不斷的向下尋找最後的父結點 while (result.getLeft() != null) result = (HeapNode<T>) result.getLeft(); } } else {// 當前堆是一個滿堆 while (result.getLeft() != null) result = (HeapNode<T>) result.getLeft(); } return result; }
問題二解決:舉個例子,git
private void heapifyAdd() { T temp; HeapNode<T> next = lastNode; temp = next.getElement(); while ((next != root) && (((Comparable) temp) .compareTo(next.getParent().getElement()) < 0)) { next.setElement(next.getParent().getElement()); next = next.parent; } next.setElement(temp); }
如圖在樹中插入結點2,那麼next指向2,temp=2,這時next不是根結點,而且2(temp)比4(next.getParent().getElement())小,因此如今next的值設置爲4(即原來2的那個位置變成4),next指向原來next的父親結點(即原來的4位置),而後將next的值設爲temp即2(原來4的位置變爲2),這樣就將2和4換位,實現了重排序。算法
問題三解決:首先把待排序的元素在二叉樹位置上排列,而後調整爲大頂堆或小頂堆,接下來進行排序,以小頂堆爲例,根結點爲最小,因此拿掉根,而後對堆進行調整,使其符合小頂堆的要求,而後新的堆頂又是最小的,將其拿掉,如此循環...藍墨雲關於這個的測試題,從新梳理一下如圖,大頂堆的過程與其相似,但注意在代碼實現中,小頂堆排序結果爲升序,大頂堆排序結果爲降序
api
問題一:在作藍墨雲測試構造大頂堆並排序時,對於過程的輸出結果是每次將最大數從堆頂拿下時的結果,並非顯示每次排序時的數組狀況。
數組
問題一解決:主要錯誤之處在於測試類,如圖中顯示,個人過程記錄是數據結構
for(int i=0;i<8;i++){ array2.addElement(array.removeMax); array2.removeMax(); System.out.println("第"+i+"次爲:"+ array2); }
首先,在循環中array中每次拿掉的最大數添加到array2中,而後輸出的是array2中的最大數,那麼就至關於每次把array中的最大數輸出,array2沒有什麼做用。應該爲學習
for (int i = 0; i <a.length; i++) { array2[i]=array.removeMax(); System.out.println("第"+ i +"次爲:"+ array); }這樣就把array2的做用發揮出來了,array2中存放array中依次彈出的最大數,在array2中降序排列,而後每次輸出array數組,顯示如今數組狀況,排序的結果就能夠用相似上面的for循環依次將array2中的數輸出。
問題二解決:測試類經過在循環中使用queue.removeNext()
方法,是因爲PriorityQueue類中removeNext方法繼承了ArrayHeap類中的removeMin方法,而在ArrayHeap類中,removeMin又使用了方法heapModifyRemove,其中測試
else if (((Comparable)tree[left]).compareTo(tree[right]) < 0) next = left
當left比right小時,返回左,我最開始不理解的是在優先級隊列中,當優先級相同時.net
if (arrivalOrder >obj.getArrivalOrder())//優先級相同時,先進先出 result = 1;
應返回左邊的arrivalOrder,但在heapModifyRemove中來講,卻返回compareTo右邊的,因此我以爲矛盾,進行屢次測試後我發現輸出的結果沒有錯。又仔細看代碼以後發現,優先級相同時,返回1的狀況是arrivalOrder較大,那麼就表明它是後進的,並非跟優先級同樣大的先,arrivalOrder越大表明晚進,應該後出,因此正好反一下。3d
問題三:實現ArrayHeap類時,發現輸出結果老是多一個數
問題三解決:參考了譚鑫同窗的博客,裏面提到了解決辦法,如圖
添加語句以後解決問題,緣由是在將根結點拿掉並用末葉子結點替換後並無將葉結點刪除,因此致使出現兩次,添加語句tree[count-1] = null;
以後,將其值設置爲空,至關於刪除。
錯題一:
錯題一解決:CompareTo方法返回值是int型的,若是前者比後者大的話返回1,小的話返回-1,相等返回0.
這一章感受原理很容易理解,邏輯簡單,但用代碼實現很差理解,可是書上代碼的可用性很高,而後實驗方面也花費較長時間,總結出來就是要儘早去掌握核心代碼再開展學習。
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | |
---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 |
第一週 | 0/0 | 1/1 | 8/8 |
第二週 | 1163/1163 | 1/2 | 15/23 |
第三週 | 774/1937 | 1/3 | 12/50 |
第四周 | 3596/5569 | 2/5 | 12/62 |
第五週 | 3329/8898 | 2/7 | 12/74 |
第六週 | 4541/13439 | 3/10 | 12/86 |
第七週 | 1740/15179 | 1/11 | 12/97 |
第八週 | 5947/21126 | 1/12 | 12/109 |