①、它是完全二叉樹,除了樹的最後一層節點不需要是滿的,其它的每一層從左到右都是滿的。注意下面兩種情況,第二種最後一層從左到右中間有斷隔,那麼也是不完全二叉樹。
②、它通常用陣列來實現。
這種用陣列實現的二叉樹,假設節點的索引值為index,那麼:
節點的左子節點是 2*index+1
節點的右子節點是 2*index+2
節點的父節點是 (index-1)/2
③、堆中的每乙個節點的關鍵字都大於(或等於)這個節點的子節點的關鍵字。
這裡要注意堆和二叉搜尋樹的區別,二叉搜尋樹中所有節點的左子節點都小於右子節點,通過乙個簡單的演算法就可以按序遍歷節點。但是在堆中,按序遍歷節點是很困難的,如圖所示,堆只有沿著從根節點到葉子節點的每一條路徑是降序排列的,指定節點的左邊節點或者右邊節點,以及上層節點或者下層節點由於不在同一條路徑上,他們的關鍵字可能比指定節點大或者小。所以相對於二叉搜尋樹,堆是弱序的。所以基本上,堆是不支援遍歷的。
對於查詢,由於堆的特性,在查詢的過程中,沒有足夠的資訊來決定選擇通過節點的兩個子節點中的哪乙個來選擇走向下一層,所以也很難在堆中查詢到某個關鍵字。
因此,堆這種組織似乎非常接近無序,不過,對於快速的移除最大(或最小)節點,也就是根節點,以及能快速插入新的節點,這兩個操作就足夠了。
移除是指刪除關鍵字最大的節點(或最小),也就是根節點。根節點在陣列中的索引總是0,即maxnode = heaparray[0];
移除根節點之後,那樹就空了乙個根節點,也就是陣列有了乙個空的資料單元,這個空單元必須填上。方法如下:
移走根把最後乙個節點移動到根的位置
一直向下篩選這個節點,直到它在乙個大於它的節點之下,小於它的節點之上為止。
圖a表示把最後乙個節點移到根節點,圖b、c、d表示將節點向下篩選到合適的位置,它的合適位置在最底層(有時候可能在中間),圖e表示節點在正確位置的情景。其中,向下篩選的時候,將目標節點和其子節點比較,誰大就和誰交換位置。
插入節點也很容易,插入時,節點初始時插入到陣列最後第乙個空著的單元,陣列容量大小增一,然後進行向上篩選的演算法。其中,向上篩選和向下不同,向上篩選只用和乙個父節點進行比較,比父節點小就停止篩選了。
首先我們要知道用陣列表示堆的一些要點。若陣列中節點的索引為index,則:
節點的左子節點是 2*index+1
節點的右子節點是 2*index+2
節點的父節點是 (index-1)/2
注意:"/" 這個符號,應用於整數的算式時,它執行整除,且得到是是向下取整的值。
package yrwan12;
public class myheap
public boolean insert(int key)
node newnode = new node(key);
heaparray[currentsize] = newnode;
trickleup(currentsize);
currentsize++;
return true;
} // 向上調整
public void trickleup(int index)
heaparray[index] = temp;
} public node remove()
// 向下調整
public void trickledown(int index) else
if (temp.getkey() >= heaparray[largechildindex].getkey())
heaparray[index] = heaparray[largechildindex];
index = largechildindex;
} heaparray[index] = temp;
} public void displayheap() else
} }public boolean isempty()
public boolean isfull()
}class node
public int getkey()
public void setkey(int key)
}
資料結構 線性結構 三 堆疊
引入 字尾表示式求值 字尾表示式 運算符號位於兩個運算數之後 例 62 3 42 8 求值策略 從左向右 掃瞄 逐個處理運算數和運算符號 遇到運算數 記住當前運算數 遇到運算子 運用對應的運算數進行計算,將計算得到的數記住 一 堆疊的抽象資料型別描述 堆疊 stack 具有一定操作約束的線性表 即只...
資料結構 Java實現 排序
直接插入排序 希爾排序 二分插入 簡單選擇排序 堆排序歸併排序 快速排序 氣泡排序 桶式排序 基數排序 插入排序由n 1趟排序組成,對於p 1到p n 1趟,保證位置0到p上的元素為已排序狀態。在第p趟,將位置p上的元素向左移動到正確位置。s n o n 2 public static super ...
資料結構 Java實現佇列
佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端 head 進行刪除操作,而在表的後端 tail 進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列中沒有元素時,稱為空佇列。佇列的資料元素又稱為佇列元素。在佇列中插入乙個佇列元素稱為入...