ZJU-PTA-05堆中的路径

时间: 40min

难度: easy

/* 熟悉堆的'下拉'/'过滤操作' 
 * easy
 */ 

#include<stdio.h>
#include<stdlib.h>

#define N 1000
struct HeapNode{
    int *Ele;
    int size;
    int capacity;
};

typedef struct HeapNode* Heap;
Heap CreateSmallHeap(int maxsize);
void Insert2Heap(Heap smallheap, int X);
void PrintPath(Heap h, int index);
int main(){
    int n;  // n个数字
    int m;  //m组标记

    int *visit;
    scanf(" %d %d", &n, &m);
    visit = (int *)malloc(sizeof(int)*m);
    Heap h = CreateSmallHeap(n);

    int i;
    for(i=0; i<n; i++){
        int tmp;
        scanf(" %d", &tmp);
        Insert2Heap(h, tmp);
    }

    for(i=0; i<m; i++){
        int tmp;
        scanf(" %d", &tmp);
        visit[i] = tmp;
        PrintPath(h, visit[i]);
    }

    free(h->Ele);
    free(h);
    free(visit);
    return 0;
}

/**
 * print the path in heap with index x
 */
 void PrintPath(Heap h, int index){
     int i=h->size;
     if(h == NULL){
         return;
     }
     if(index>i){
         return ;
     }
     for(i=index; i>1; i=i/2){
         printf("%d ", h->Ele[i]);
     }
    printf("%d\n", h->Ele[i]);
 }
/**
 *  按照给定的大小建立一个小根堆,小根堆中下标0元素放置了最小元素--哨兵
 */
Heap CreateSmallHeap(int maxsize){
    int *arr = (int *)malloc( (maxsize+1) * sizeof(int));
    Heap h = (Heap) malloc(sizeof(struct HeapNode));
    h->Ele = arr;
    h->size = 0;
    h->capacity = maxsize;
    arr[0] =  1<<((sizeof(int)*8)-1) ; //minimum in int
    return h;
}

void Insert2Heap(Heap smallheap, int X){
    int i, p;
    Heap h = smallheap;
    ++(h->size);
    //从上往下拉,让出合适的位置给新插入的元素X
    for( i=h->size; X < h->Ele[i/2]; i=p){
        p = i/2;
        if( X < h->Ele[p]){
            h->Ele[i] = h->Ele[p];
            continue;
        }
        break;
    }
    h->Ele[i] = X;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值