数据结构-最小堆插入,输出堆中的路径

题目

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

运行结果

Case Hint Result Run Time Memory
0 sample 调整到根、到中间位置,有不需要调整的元素 Accepted 2 ms 424 KB
1 路径更长,交错,index从中间开始,有负数 Accepted 2 ms 424 KB
2 最小N和M Accepted 2 ms 424 KB
3 最大N和M随机,元素取到正负10000 Accepted 7 ms 384 KB

程序


#include<iostream>
using namespace std;

typedef int ElementType;
typedef struct HNode *Heap;
struct HNode{
    ElementType *Data; //储存元素的数组
    int Size;          //堆中当前元素个数
    int Capacity;      //堆的最大容量
};
typedef Heap MinHeap; //最小堆

#define MINDATA -10001 //该值需要小于堆中所有可能元素的值
#define MAXSIZE 1000

void PrintToRoot(MinHeap H, int Index);
MinHeap Create(int MaxSize);
bool IsFull(MinHeap H);
void Insert(MinHeap H, ElementType X);
bool IsEmpty(MinHeap H);

int main()
{
    MinHeap H;
    int N, M, Index;
    ElementType X;
    /*
    //测试用例
    N = 5;
    M = 3;
    ElementType inputX[5] = {46,23,26,24,10};
    H = Create(MAXSIZE);
    for(int i=0; i<N; i++){
        Insert(H, inputX[i]);
    }
    */
    cin >> N;
    cin >> M;
    //通过输入建立最小堆
    H = Create(MAXSIZE);
    for(int i=0; i<N; i++){
        cin >> X;
        Insert(H, X);
    }
    //通过输入下标,输出下标元素到根结点元素的值
    /*
    //测试用例
    M = 3;
    int outDataIndex[3] = {5,4,3};
    for(int i=0; i<M; i++){
        PrintToRoot(H, outDataIndex[i]);
    }
    */
    for(int i=0; i<M; i++){
        cin >> Index;
        PrintToRoot(H, Index);
    }
    return 0;
}

void PrintToRoot(MinHeap H, int Index)
{
    for(; Index >1; Index /= 2){
        cout << H->Data[Index] << " ";
    }
    cout << H->Data[1] <<endl;
}

void Insert(MinHeap H, ElementType X)
{
    int i;
    if(IsFull(H)){
        cout << "MinHeap is full" <<endl;
        return;
    }
    else if(IsEmpty(H)){
        H->Data[++H->Size] = X;
        return;
    }
    i = ++H->Size;
    for(; H->Data[i/2] > X; i/=2){
        H->Data[i] = H->Data[i/2];
    }
    H->Data[i] = X;
}

//创建容量为MaxSize的最小堆
MinHeap Create(int MaxSize)
{
    MinHeap H = new HNode;
    H->Data = new ElementType [MaxSize + 1];
    H->Size = 0;
    H->Capacity = MaxSize;
    H->Data[0] = MINDATA;
    return H;
}

bool IsFull(MinHeap H)
{
    return (H->Size == H->Capacity);
}

bool IsEmpty(MinHeap H)
{
    return (H->Size == 0);
}

猜你喜欢

转载自blog.csdn.net/Brianone/article/details/89344858