PTA数据结构与算法题目集(中文) 7-5

PTA数据结构与算法题目集(中文)  7-5  堆中的路径

7-5 堆中的路径 (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

题目分析:考查最小堆(优先队列)的实现 需要注意的是 利用插入操作建立最小(大)堆 和 先把数据读入完全二叉树 再调整的方法 可能建成的堆不同 并且他们的时间复杂度也不同(插入操作所需要的时间复杂度为 o(nlogn) 第二种方法的时间复杂度为 线性时间)
 1 #define _CRT_SECURE_NO_WARNINGS   
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #include<malloc.h>
 5 
 6 typedef struct HeapStruct* MinHeap;
 7 struct HeapStruct
 8 {
 9     int Size;
10     int Capacity;
11     int* Elements;
12 };
13 
14 MinHeap CreatMinHeap(int Capacity)
15 {
16     MinHeap H;
17     H = (MinHeap)malloc(sizeof(struct HeapStruct));
18     H->Capacity = Capacity;
19     H->Elements = (int*)malloc(H->Capacity * sizeof(int));
20     H->Size = -1;
21     return H;
22 }
23 
24 void Insert(MinHeap H, int Element)
25 {
26     int i = ++H->Size;
27     for (; i > 0 && Element < H->Elements[(i - 1) / 2]; i = (i - 1) / 2)
28         H->Elements[i] = H->Elements[(i - 1) / 2];
29     H->Elements[i] = Element;
30 }
31 
32 void Delete(MinHeap H)
33 {
34     int Tmp = H->Elements[H->Size--];
35     int Parent;
36     int Child;
37     for (Parent=0;(Parent*2+1)<=H->Size;Parent=Child)
38     {
39         Child = Parent * 2 + 1;
40         if (Child != H->Size && H->Elements[Child] > H->Elements[Child + 1])
41             Child++;
42         if (Tmp <= H->Elements[Child])break;
43         else
44             H->Elements[Parent] = H->Elements[Child];
45     }
46     H->Elements[Parent] = Tmp;
47 }
48 
49 void PrecDown(MinHeap H,int i)
50 {
51     int Tmp = H->Elements[i];
52     int  Parent;
53     int Child;
54     for (Parent = i; (Parent * 2 + 1) < H->Size; Parent = Child)
55     {
56         Child = Parent * 2 + 1;
57         if (Child != H->Size && H->Elements[Child] > H->Elements[Child + 1])
58             Child++;
59         if (Tmp <= H->Elements[Child])break;
60         else
61             H->Elements[Parent] = H->Elements[Child];
62     }
63     H->Elements[Parent] = Tmp;
64 }
65 
66 void BuildHeap(MinHeap H)
67 {
68     for (int i = (H->Size - 1) / 2; i>=0; i--)
69         PrecDown(H, i);
70 }
71 
72 void Print(MinHeap H,int i)
73 {
74     while (i>0)
75     {
76         printf("%d ", H->Elements[i]);
77         i = (i - 1) / 2;
78     }
79     printf("%d", H->Elements[0]);
80 }
81 int main()
82 {
83     int N, M;
84     scanf("%d %d", &N, &M);
85     MinHeap H = CreatMinHeap(N);
86     for (int i = 0; i < N; i++)
87     {
88         int num;
89         scanf("%d", &num);
90         Insert(H, num);
91     }
92     for (int j = 0; j < M; j++)
93     {
94         int i;
95         scanf("%d", &i);
96         Print(H, i-1);
97         printf("\n");
98     }
99 }
View Code

 

 
posted @ 2019-09-24 19:32  57one  阅读(395)  评论(0编辑  收藏  举报