將一系列給定數字插入乙個初始為空的小頂堆h
。隨後對任意給定的下標i
,列印從h[i]
到根結點的路徑。
每組測試第1行包含2個正整數n和m(≤1000),分別是插入元素的個數、以及需要列印的路徑條數。下一行給出區間[-10000, 10000]內的n個要被插入乙個初始為空的小頂堆的整數。最後一行給出m個下標。
對輸入中給出的每個下標i
,在一行中輸出從h[i]
到根結點的路徑上的資料。數字間以1個空格分隔,行末不得有多餘空格。
5 3
46 23 26 24 10
5 4 3
24 23 10
46 23 10
26 10
這裡堆使用陣列下標從1開始的經典實現方法, 這裡建立堆的方式使用逐個插入建立的方法,這種方法是時間複雜度是o(nlogn)。而有一種更直接的方法是直接將陣列調整為堆,時間複雜是o(logn)。從葉子節點到根節點使用i/2遍歷即可。
#include #include // 最小堆
class heap
~heap()
void insert(int x)
heap[i] = x;
} void print(int m)
for (int i = 0; i < m; i++)
}
最小堆的路徑
本題完成最小堆的建立 將一系列給定數字插入乙個初始為空的小頂堆h。隨後對任意給定的下標i,列印從h i 到根結點的路徑。每組測試第1行包含2個正整數n和m 1000 分別是插入元素的個數 以及需要列印的路徑條數。下一行給出區間 10000,10000 內的n個要被插入乙個初始為空的小頂堆的整數。最後...
C Heap 堆的實現(最小堆 最大堆)
堆也叫優先佇列,堆是一種特殊的完全二叉樹資料結 堆分為兩種,最大堆,最小堆。最大堆 根節點大於左右兩個子節點的完全二叉樹 最小堆 根節點小於左右兩個子節點的完全二叉樹 堆可以用陣列來儲存,a i 處存根節點,a 2 i 存左子樹的根節點 a 2 i 1 存右子樹的根節點。i從1開始 元素下沉 voi...
最小堆的建立及堆排序
堆的建立 堆在很多方面都有運用,這裡寫一下將乙個完全二叉樹用一維陣列儲存後再轉化為乙個最小堆 如下 假如樹中的資料都為整數 include int a 50 int n void swap int p,int q void siftdown int i if t i else flag 1 父結點小...