• 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("
    ");
    98     }
    99 }
    View Code
     
  • 相关阅读:
    推荐几个jQuery插件
    windows中安装node.js和测试
    使用javascript改变图片路径
    如何使用jQuery 制作全屏幕背景的嵌入视频
    SQL优化:一些简单的又实用的SQL优化方案【转】
    CentOS 6和 CentOS 7的区别【转】
    ssh密匙互信操作【原创】
    orchestrator的安装和配置
    部署gerrit环境完整记录【转】
    MySQL两地三中心方案初步设计【转】
  • 原文地址:https://www.cnblogs.com/57one/p/11580443.html
Copyright © 2020-2023  润新知