zoukankan      html  css  js  c++  java
  • 05-树7 堆中的路径(25 分)

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

    我的答案:
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <unistd.h>
     4 
     5 #define MinData -10001
     6 typedef struct HeapStruct *MinHeap;
     7 struct HeapStruct {
     8     int *Data;
     9     int Size;
    10     int Capacity;
    11 };
    12 
    13 MinHeap Create(int MaxSize)
    14 {
    15     MinHeap H = malloc(sizeof(struct HeapStruct));
    16     H->Data = malloc((MaxSize+1)*sizeof(int));
    17     H->Size = 0;
    18     H->Capacity = MaxSize;
    19     H->Data[0] = MinData;
    20 
    21     return H;
    22 }
    23 
    24 int IsFull(MinHeap H)
    25 {
    26     return (H->Size == H->Capacity);
    27 }
    28 
    29 void Insert(MinHeap H, int item)
    30 {
    31     int i;
    32     if(IsFull(H)) {
    33         printf("Heap Full!");
    34         return;
    35     }
    36     i = ++H->Size;
    37     for(;H->Data[i/2]>item;i/=2) {
    38         H->Data[i] = H->Data[i/2];
    39         // printf("i=%d H->Data[%d]=%d
    ", i, i, H->Data[i]);
    40     }
    41     H->Data[i] = item;
    42 } 
    43 
    44 void Print(MinHeap H, int M)
    45 {
    46     int i, j;
    47     int first_flag = 0;
    48 
    49     for(i=0;i<M;i++) {
    50         first_flag = 0;
    51         scanf("%d", &j);
    52         for(;j>0;j/=2) {
    53             if(first_flag==0) {
    54                 printf("%d", H->Data[j]);
    55                 first_flag++;
    56             } else {
    57                 printf(" %d", H->Data[j]);
    58             }
    59         }
    60         printf("
    ");
    61     }
    62 }
    63 
    64 int main()
    65 {
    66     int N, M, i;
    67     int data;
    68     MinHeap mHeap;
    69 
    70     scanf("%d %d
    ", &N, &M);
    71     mHeap = Create(N);
    72     for(i=0;i<N;i++) {
    73         scanf("%d", &data);
    74         Insert(mHeap, data);
    75     }
    76     // for(i=1;i<=N;i++) {
    77         // printf("%d ", mHeap->Data[i]);
    78     // }
    79     // printf("
    ");
    80     Print(mHeap, M);
    81 }
    无欲速,无见小利。欲速,则不达;见小利,则大事不成。
  • 相关阅读:
    CentOS 7 安装 Nginx (LNMP环境搭建第一步)
    JS去除字符串最后的逗号
    mkdir如何创建多级目录
    php实现获取数组中相同/不相同的元素
    git 查看远程仓库地址
    windows git pull或者push或者clone代码时弹出安全框解决办法
    【laravel】api路由无法访问
    PHP开发api接口安全验证
    PHP根据身份证号码,获取性别、获取生日、计算年龄等多个信息
    PHP按一定比例压缩图片
  • 原文地址:https://www.cnblogs.com/ch122633/p/8832820.html
Copyright © 2011-2022 走看看