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