浙大PAT 堆的操作集

2021-10-05 12:00:33 字數 1914 閱讀 6806

7-5 堆中的路徑 (25分)

將一系列給定數字插入乙個初始為空的小頂堆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

自頂向下和自底向上都是沿著根到葉的路徑調整,時間複雜度為o(logn)即樹高。

插入操作:新元素插入到堆的末尾,沿著到根的路徑自底向上調整;

刪除操作:刪除堆根元素,將堆末尾元素移到根,選擇正確的道路自頂向下調整

#include

#include

#define max 1000

#define maxdata 10001

#define mindata -10001

typedef

int elementtype;

typedef

struct hnode

*heap;

typedef heap maxheap;

typedef heap minheap;

minheap creatnullminheap

(int size)

intisfull

(minheap h)

intisempty

(minheap h)

void

adjustup

(minheap h,

int position)

h->data[child]

= h->data[0]

;}void

adjustdown

(minheap h,

int position)

else

//與自底向上調整不同,若找到了正確的位置應跳出迴圈

break;}

h->data[parent]

= h->data[0]

;}void

insertminheap

(minheap h,

int e)

elementtype deleteminheap

(minheap h)

elementtype x = h->data[1]

; h->data[1]

= h->data[h->size--];

adjustdown

(h,1);

return x;

}void

buildminheap

(minheap h)

}void

printload

(minheap h,

int position)

printf

("\n");

}int

main()

// buildminheap(h);

elementtype x;

while

(n--

)while

(m--

)return0;

}

浙大PAT甲級 1107 並查集

這個題目求有共同愛好的人的集體數,以及從大到小輸出各個集體的人數。並查集的思想。我的思路是 用num i 陣列表示根為愛好i的人數個數。最後排序統計不等於的num i 有多少個,然後排序,後序輸出。ac include include include include include include ...

浙大PAT 樹的同構

7 3 樹的同構 25分 給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是 同構 的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a b g的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。圖1 圖2現給定兩棵樹,請你判斷它們是否是同構的。輸入...

pat 二叉樹的遍歷 浙大的PAT

給定一棵二叉樹的後序遍歷和中序遍歷,請你輸出其層序遍歷的序列。這裡假設鍵值都是互不相等的正整數。輸入格式 輸入第一行給出乙個正整數 n n 30 是二叉樹中結點的個數。第二行給出其後序遍歷序列。第三行給出其中序遍歷序列。數字間以空格分隔。輸出格式 在一行中輸出該樹的層序遍歷的序列。數字間以1個空格分...