PTA 資料結構與演算法 7 5 堆中的路徑

2021-09-20 15:30:09 字數 1435 閱讀 1780

如有不對 不吝賜教

將一系列給定數字插入乙個初始為空的小頂堆h。隨後對任意給定的下標i,列印從h[i]到根結點的路徑。

輸入格式:

每組測試第1行包含2個正整數n和m(≤1000),分別是插入元素的個數、以及需要列印的路徑條數。下一行給出區間[-10000, 10000]內的n個要被插入乙個初始為空的小頂堆的整數。最後一行給出m個下標。

輸出格式:

對輸入中給出的每個下標i,在一行中輸出從h[i]到根結點的路徑上的資料。數字間以1個空格分隔,行末不得有多餘空格。

輸入樣例:

5 346 23 26 24 10

5 4 3

輸出樣例:

24 23 10

46 23 10

26 10

這道題目就只要把堆建好,然後將元素按照順序打出來就行了

這裡的關鍵就是父節點和子節點下標之間的相互轉換

在這裡 我利奇數的最後一位為1的特性來實現子節點到父節點,具體來說就是下面的**

father=

(son+

(son&1)

)/2-

1;

然後還要注意的就是最後乙個元素的位置,我選擇的是先填充元素,tail在自增(有的時候使用先自增在填充元素更為簡便,這得具體問題具體分析)

下面給出**

#include

#define end 99999

#define swap

(a,b) a=

(a)^

(b),b=

(a)^

(b),a=

(a)^

(b)int tail=0;

void

insert

(int

*heap,

int temp)

;int

main

(void

)for

(i=0

;i) path[i]

[j++

]=heap[0]

; path[i]

[j]=end;

//作為結束標記

}for

(i=0

;i)return0;

}void

insert

(int

*heap,

int temp)

else

break;}

return

;}

執行結果

PTA資料結構與演算法題目集 中文 7 5

7 5 堆中的路徑 25 分 將一系列給定數字插入乙個初始為空的小頂堆h。隨後對任意給定的下標i,列印從h i 到根結點的路徑。每組測試第1行包含2個正整數n和m 分別是插入元素的個數 以及需要列印的路徑條數。下一行給出區間 10000,10000 內的n個要被插入乙個初始為空的小頂堆的整數。最後一...

資料結構與演算法 堆結構

1 本質 一顆特殊的樹。2 特性 3 分類 對於每乙個節點的值都大於等於子節點的值的情況,該堆被稱為大頂堆。對於每乙個節點的值都小於等於子節點的值的情況,該堆被稱為小頂堆。4 儲存方式 對於完全二叉樹而言,陣列儲存方式是最節省記憶體的。5 插入節點的時間複雜度 將節點插入到靠左的底層作為新的葉子節點...

資料結構與演算法 堆

堆 完全二叉樹,高度為o lgn 基本操作至多和樹的高度成正比,構建堆的時間複雜度是o n 堆是一顆完全二叉樹,假設有n個節點,樹高h log2 n 證明方法如下 1 假設根節點的高度為0,葉子節點高度為h,每層包含元素個數為2 x,x 從0 到h。2 構建堆的過程是自下而上,對於每層非葉子節點需要...