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

来源:互联网 发布:游戏程序员需要做什么 编辑:程序博客网 时间:2024/05/19 19:44

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

输入格式:

每组测试第1行包含2个正整数NNNMMM(≤1000\le 10001000)NNN个要被插入一个初始为空的小顶堆的整数。最后一行给出MMM个下标。

输出格式:

对输入中给出的每个下标i,在一行中输出从H[i]到根结点的路径上的数据。数字间以1个空格分隔,行末不得有多余空格。

输入样例:

5 346 23 26 24 105 4 3

输出样例:

24 23 1046 23 1026 10
//使用指针竟然忘了赋初值。。debug半天。。#include <stdio.h>#include <stdlib.h>#define MINDATA -10005struct 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 -10005int 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;}

原创粉丝点击