二叉堆(最小堆)的C語言實現

2021-09-26 03:32:42 字數 1848 閱讀 3130

本**參考《漫畫演算法》一書,作者魏夢書。

先說一下環境,win10,vs2017,不使用預編譯頭。

本**使用陣列(也可以使用鍊錶)構建二叉堆,二叉堆是一種特殊的完全二叉樹,所以父節點索引和子節點索引符合以下公式:

children_left=parent2+1;

children_right=parent2+2;

對於二叉堆,有如下幾種操作:

插入節點

當二叉堆插入節點時,插入位置時完全二叉樹的最後乙個位置。這時需要使用上浮操作將新加入的節點「浮」到合適位置。

刪除節點

二叉堆刪除節點的過程和插入節點的過程正好相反,刪除的是處於堆頂的節點。刪除後為了保持二叉堆的結構,將最後乙個位置的節點臨時補到堆頂,然後利用下沉操作找到該節點的合適位置。

構建二叉堆

將乙個無序的陣列構建成二叉堆,本質上就是讓所有非子葉節點依次完成「下沉操作」。

/*

project:構建最小二叉堆

editor:幫我起個暱稱吧

date:2019.8.13

*/#include #define debug printf("----------到這裡沒問題-----------\n")

void print_array(int* arr, int length);

//上浮調整

void upadjust(int* arr,int length)

arr[childrenindex] = temp;

}//下沉調整

void downadjust(int* arr,int parentindex, int arr_length)

//如果父節點小於等於子節點,那麼直接跳出,無需「下沉」

if (temp <= arr[children])

break;

//將子節點數值賦值給父節點

arr[parentindex] = arr[children];

parentindex = children;

children = parentindex * 2 + 1;

} arr[parentindex] = temp;

}//構建堆

void buildheap(int* arr,int length) }

int main(int argc, char* ar**)

; //顯示輸出的陣列

printf("輸入的陣列為:\n");

print_array(arr, sizeof(arr) / sizeof(arr[0]));

//呼叫上浮操作

upadjust(arr, sizeof(arr) / sizeof(arr[0]));

printf("呼叫上浮後陣列輸出為:\n");

print_array(arr, sizeof(arr) / sizeof(arr[0]));

int arr2[10] = ;

//顯示輸出的陣列

printf("輸入的陣列為:\n");

print_array(arr2, sizeof(arr2) / sizeof(arr2[0]));

//呼叫構建堆

buildheap(arr2, sizeof(arr2) / sizeof(arr2[0]));

printf("呼叫構建堆後陣列輸出為:\n");

print_array(arr2, sizeof(arr2) / sizeof(arr2[0]));

return 0;

}//列印陣列函式

void print_array(int* arr, int length)

printf("\n");

}

最小堆的插入(C語言實現)

最小堆,是一種經過排序的完全二叉樹,其中任一非終端節點的資料值均不大於其左子節點和右子節點的值。通俗的說就是 1.陣列來實現二叉樹,所以滿足二叉樹的特性。2.根元素是最小的元素,父節點小於它的兩個子節點。3.樹中的元素是相對有序的。如何實現堆的相對有序是關鍵。插入元素時,插入到陣列中的最後乙個元素的...

二叉堆的c 實現

在下小白乙個 如有錯誤請指正 上 using system using system.collections.generic 資料結構 namespace datastructure 刪除 刪除的key public void remove t key 銷毀 public void destory ...

二叉查詢樹C語言實現

二叉查詢樹c語言實現 1.二叉查詢樹的定義 左子樹不為空的時候,左子樹的結點值小於根節點,右子樹不為空時,右子樹的結點值大於根節點,左右子樹分別為二叉查詢樹 2.二叉查詢樹的最左邊的結點即為最小值,要查詢最小值,只需遍歷左子樹的結點直到為空為止,同理,最右邊的結點結尾最大值,要查詢最大值,只需遍歷右...