二叉堆構建

2021-10-04 09:18:10 字數 1473 閱讀 2947

二叉堆本質上一種完全二叉樹,分為:最小堆和最大堆,二叉堆的根結點叫做堆頂

最大堆:最大堆的任何乙個父節點的值都大於或等於他的左右節點的值,最大堆的堆頂是整個堆中最大元素

最小堆:最小堆的任何乙個父節點的值都小於或等於他的左右節點的值,最小堆的堆頂是這個堆中最小元素

二叉堆的幾種操作:

1、插入節點:插入位置是完全二叉樹的最後乙個位置;堆的插入操作是單一節點的「上浮」,平均交換次數都是堆高度的一半,所以時間複雜度是o(logn)

2、刪除節點:刪除的是處於堆頂的節點;堆的刪除操作是單一節點的「下沉」,平均交換次數都是堆高度的一半,所以時間複雜度是o(logn)

3、構建二叉堆:就是將乙個完全無序的二叉樹調整為二叉堆,本質上就是讓所有非葉子結點依次「下沉」;時間複雜度是o(n)

/**

* 二叉堆構建

*/public class adjust

int childindex = arr.length - 1;

int parentindex = (childindex - 1) / 2;

//儲存插入的葉子結點的值,用於最後的賦值

int temp = arr[childindex];

while (childindex > 0 && temp < arr[parentindex])

arr[childindex] = temp;

}/**

* "下沉"調整

** @param arr 待調整值

* @param parentindex 待下沉的父節點

* @param length 堆的有效大小

*/public static void downadjust(int arr, int parentindex, int length)

//如果父節點小於任何乙個孩子的值,直接退出

if (temp < arr[childindex])

//無須交換,單向賦值即可

arr[parentindex] = arr[childindex];

parentindex = childindex;

childindex = 2 * childindex + 1;

}arr[parentindex] = temp;

}/**

* 構建堆

** @param arr

*/public static void buildheap(int arr)

}public static void main(string args) ;

upadjust(arr);

system.out.println(arrays.tostring(arr));

arr = new int;

buildheap(arr);

system.out.println(arrays.tostring(arr));

}}

二叉堆的構建 插入 刪除等操作

若設二叉樹的深度為h,除第h層外,其它各層 1 h 1 的結點數都達到最大個數,第h層的所有節點都集中在左邊的若干位置,這就是完全二叉樹 以小根堆舉例 具有完全二叉樹的特性,插入乙個節點的時候,需要保證節點插入後,仍然是一顆完全二叉樹,然後在進行調整,使它滿足二叉堆的另乙個特性 具有完全二叉樹的特性...

(二叉)堆操作

堆操作 實驗目的 一 建堆 將陣列a 1.n 變成乙個最大堆。二 堆排序 將乙個堆中的元素按遞減排序輸出。三 用插入方法建堆 堆大小從1到n每次插入乙個元素到堆中,直到n個元素入堆。實驗原理 二叉 堆是乙個陣列,它可以被看成乙個近似的完全二叉樹。樹上的每乙個結點對應陣列中的乙個元素。除了最底層外,該...

簡單 二叉堆

堆是一種比較有用的資料結構,是二叉樹的一種陣列的表示形式。最大堆和最小堆是二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者。最小堆 根結點的鍵值是所有堆結點鍵值中最小者。而最大 最小堆集結了最大堆和最小堆的優點,這也是其名字的由來。最大 最小堆是最大層和最小層交替出現的二叉樹,即最大層...