【MOOC】05-树7 堆中的路径 (25分)(建立最小堆)

    科技2022-08-01  91

    将一系列给定数字插入一个初始为空的小顶堆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

    #include <iostream> using namespace std; int h[1005];//存储堆中的数据 int n,m,num; void swap(int x,int y){ int tmp = h[x]; h[x] = h[y]; h[y] = tmp; } void heap(){ //下标从1开始,一般堆的都是这个习惯 for(int i = 1;i<=n;i++){ cin >> h[i]; int k = i; //边比较边交换 while(k/2>0&&h[k]<h[k/2]){ swap(k,k/2); k /= 2; } } } int main(){ cin >> n >> m; heap(); for(int i = 0;i<m;i++){ cin >> num; int k = num; //还未到达根结点 while(k!=1){ cout << h[k] << " "; k /= 2;//注意/2,层数减1 } //输出根结点 cout << h[k] << endl; } return 0; }

    Processed: 0.011, SQL: 8