本**參考《漫畫演算法》一書,作者魏夢書。
先說一下環境,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.二叉查詢樹的最左邊的結點即為最小值,要查詢最小值,只需遍歷左子樹的結點直到為空為止,同理,最右邊的結點結尾最大值,要查詢最大值,只需遍歷右...