堆中的路径

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

 

 

 

#include <iostream>
using namespace std;
struct Node{
    int *s;
    int size;
    int maxn_size;
}; 
typedef Node *MinHeap;
MinHeap create(int Maxn){
    MinHeap h = new struct Node();
    h->s = new int[Maxn + 1];
    h->size = 0;
    h->maxn_size = Maxn;
    h->s[0] = -100001;//哨兵
    return h; 
}
void insert(MinHeap h, int t){
    if(h->size == h->maxn_size){
        cout << "the MinHeap is full" << endl;
        return;
    }
    int i = ++h->size;
    for(; t < h->s[i/2]; i/=2){
        h->s[i] = h->s[i / 2];
    }
    h->s[i] = t;
}
void print(MinHeap h, int t){
    if(t > h->size){
        cout << "ERROR" << endl;
        return;
    }
    for(int i = t; t > 0; t/=2){
        if(i != t){
            cout << ' ';
        }
        cout << h->s[t];
    }
}
int main(){
    int n, m;
    cin >> n;
    cin >> m;
    MinHeap myHeap= create(n);
    for(int i = 0; i < n; i++){
        int t;
        cin >> t;
        insert(myHeap, t);
    }
    for(int i = 0; i < m; i++){
        int t;
        cin >> t;
        print(myHeap, t);
        cout << endl; 
    }    
    return 0;
}

 

posted @ 2019-03-05 09:35  kakaluotedj  阅读(122)  评论(0)    收藏  举报