二叉堆本質上一種完全二叉樹,分為:最小堆和最大堆,二叉堆的根結點叫做堆頂
最大堆:最大堆的任何乙個父節點的值都大於或等於他的左右節點的值,最大堆的堆頂是整個堆中最大元素
最小堆:最小堆的任何乙個父節點的值都小於或等於他的左右節點的值,最小堆的堆頂是這個堆中最小元素
二叉堆的幾種操作:
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個元素入堆。實驗原理 二叉 堆是乙個陣列,它可以被看成乙個近似的完全二叉樹。樹上的每乙個結點對應陣列中的乙個元素。除了最底層外,該...
簡單 二叉堆
堆是一種比較有用的資料結構,是二叉樹的一種陣列的表示形式。最大堆和最小堆是二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者。最小堆 根結點的鍵值是所有堆結點鍵值中最小者。而最大 最小堆集結了最大堆和最小堆的優點,這也是其名字的由來。最大 最小堆是最大層和最小層交替出現的二叉樹,即最大層...