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

5-树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 <stdio.h>
#include <stdlib.h>
#define MAXN 1001
#define MINH -10001

int H[MAXN], size;

void Create(){
    size = 0;
    H[0] = MINH;
}

void Insert(int elem)
{
    int i;
    for(i=++size; H[i/2] > elem; i/=2){
        H[i] = H[i/2];
    }
    H[i] = elem;
}

int main()
{
    int N, QueryN, elem;
    scanf("%d %d", &N, &QueryN);
    Create();
    for(int i = 0; i < N; i++){
        scanf("%d", &elem);
        Insert(elem);
    }
    int j;
    for(int i=0; i < QueryN; i++){
        scanf("%d", &j);
        printf("%d", H[j]);
        while(j>1){
            j/=2;
            printf(" %d", H[j]);
        }
        printf("\n");
    }
    return 0;
}

提测结果:

 

 2021-08-05:

#include <stdio.h>
#include <stdlib.h>
const int MIN = -10001;
typedef int ElemType;
typedef struct HeapStruct *MinHeap;
struct HeapStruct{
    ElemType* data;
    int size;//大小
    int capacity;//容量
};

MinHeap CreateHeap(int size){
    MinHeap H = (MinHeap)malloc(sizeof(struct HeapStruct));
    H->data = (ElemType*)malloc((size+1)*sizeof(ElemType));
    H->size = 0;
    H->capacity = size;
    H->data[0] = MIN;
    return H;
}
int IsFull(MinHeap H){
    if(H && H->size == H->capacity){
        return 1;
    }
    return 0;
}

void Insert(MinHeap H, ElemType item){
    int i;
    if(IsFull(H)){
        return;
    }
    i = ++H->size;
    for( ; H->data[i/2] > item; i/=2){
        H->data[i] = H->data[i/2];
    }
    H->data[i] = item;
}

void PrintPath(MinHeap H, int index){
    int first = 1;
    for(int j = index; j > 0; j/=2){
        if(first){
            first = 0;
            printf("%d", H->data[j]);
        }
        else{
            printf(" %d", H->data[j]);
        }
    }
    if(first == 0)
    {
        printf("\n");
    }
}

void Print(MinHeap H, int M){
    for(int i = 0; i < M; ++i){
        int index;
        scanf("%d", &index);
        PrintPath(H, index);
    }
}

int main(){
    int N,M;
    scanf("%d %d",&N,&M);
    MinHeap H = CreateHeap(N);
    for(int i = 0; i < N; ++i){
        int item;
        scanf("%d", &item);
        Insert(H, item);
    }
    Print(H, M);
    return 0;
}

 

 

posted @ 2020-08-13 00:32  余生以学  阅读(126)  评论(0)    收藏  举报