05-树7 堆中的路径 (25 分)

 
 

将一系列给定数字插入一个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。

输入格式:

每组测试第1行包含2个正整数N和M(≤),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-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 <cstdio>
#include <stdlib.h>
const int maxn = 1001;
const int MinData = -100001;
struct HeapStruct 
{
    int* data;
    int size;
    int capacity;
};
typedef struct HeapStruct* MinHeap;
MinHeap h = NULL;

MinHeap createHeap(int MaxSize);
void insert(MinHeap h, int data);
void outPut(int m);
void showPathway(int root);


int main() 
{
    int n, m;
    scanf("%d%d", &n, &m);
    h = createHeap(n);
    for (int i=0; i<n; i++) {
        int data; scanf("%d", &data);
        insert(h, data);
    }
    outPut(m);
    return 0;
}

MinHeap createHeap(int MaxSize)
{
    MinHeap H = (MinHeap) malloc( sizeof(struct HeapStruct) );
    H->data = (int *) malloc(sizeof(int) * (MaxSize + 1));
    H->size = 0;
    H->capacity = MaxSize;
    H->data[0] = MinData;
    return H;
}

void insert(MinHeap h, int data) 
{
    int i = ++h->size;
    for(; h->data[i/2] > data; i /= 2)
    {
        h->data[i] = h->data[i/2];
    }
    h->data[i] = data;
}

void outPut(int m)
{
    int root;
    for (int i=0; i<m; i++) {
        scanf("%d", &root);
        showPathway(root);
    }
}

void showPathway(int root)
{
    int flag = 1;
    while (root != 0) {
        if(flag) {
            printf("%d", h->data[root]);
            flag = 0;
        }
        else printf(" %d", h->data[root]);
        root /= 2;
        
    }
    printf("\n");
}







猜你喜欢

转载自www.cnblogs.com/acoccus/p/10723864.html
今日推荐