练习4.3 堆中的路径 (25point(s))
将一系列给定数字插入一个初始为空的小顶堆H[]
。随后对任意给定的下标i
,打印从H[i]
到根结点的路径。
Example:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int N, M;
cin >> N >> M;
vector<int> H;
H.reserve(N+1);
for(int i = 1; i <= N; i++) {
cin >> H[i];
int parent = i / 2;
int cur = i;
while(parent) {
if(H[cur] < H[parent]) {
swap(H[cur], H[parent]);
cur = parent;
parent = cur / 2;
continue;
}
break;
}
}
while (M--) {
int i;
cin >> i;
while(i) {
cout << H[i];
if(i == 1) cout << endl;
else cout << ' ';
i >>= 1;
}
}
return 0;
}
思路:
插入新元素到小顶堆末尾,如果小于父节点,就交换,直到不能交换。