将一系列给定数字插入一个初始为空的小顶堆H[]
。随后对任意给定的下标i
,打印从H[i]
到根结点的路径。
输入格式:
每组测试第1行包含2个正整数NNN和MMM(≤1000\le 1000≤1000)NNN个要被插入一个初始为空的小顶堆的整数。最后一行给出MMM个下标。
输出格式:
对输入中给出的每个下标i
,在一行中输出从H[i]
到根结点的路径上的数据。数字间以1个空格分隔,行末不得有多余空格。
输入样例:
5 3
46 23 26 24 10
5 4 3
输出样例:
24 23 10 46 23 10 26 10
//使用指针竟然忘了赋初值。。debug半天。。 #include <stdio.h> #include <stdlib.h> #define MINDATA -10005 struct HNode { int Data[1005]; int size; }; typedef struct HNode* Heap; Heap Creat() { Heap H; H = (Heap)malloc(sizeof(struct HNode)); H->Data[0] = MINDATA; H->size = 0; return H; } void Insert(Heap H, int x) { int i = ++H->size; for( ; x < H->Data[i/2]; i /= 2) H->Data[i] = H->Data[i/2]; H->Data[i] = x; } void search(int x, Heap H) { int i = x, flag = 0; while(i != 0) { if(!flag) flag = 1; else printf(" "); printf("%d", H->Data[i]); i /= 2; } printf("\n"); } int main() { int N, M, x; int i; Heap H; scanf("%d%d", &N, &M); H = Creat(); while(N--) { scanf("%d", &x); Insert(H, x); } //for(i = 1; i <= H->size; i++) printf("%d ", H->Data[i]); while(M--) { scanf("%d", &x); search(x, H); } return 0; } //其实只用数组就可以了。。 #include <stdio.h> #define MAXN 1005 #define MINDATA -10005 int Data[MAXN], size; void Insert(int x) { int i = ++size; for( ; x < Data[i/2]; i /= 2) Data[i] = Data[i/2]; Data[i] = x; } int main() { int N, M; int x; scanf("%d%d", &N, &M); Data[0] = MINDATA; size = 0; while(N--) { scanf("%d", &x); Insert(x); } while(M--) { scanf("%d", &x); printf("%d", Data[x]); x /= 2; while(x) { printf(" %d", Data[x]); x /= 2; } printf("\n"); } return 0; }