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自頂向下和自底向上都是沿著根到葉的路徑調整,時間複雜度為o(logn)即樹高。46 23 10
26 10
插入操作:新元素插入到堆的末尾,沿著到根的路徑自底向上調整;
刪除操作:刪除堆根元素,將堆末尾元素移到根,選擇正確的道路自頂向下調整
#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個空格分...