Bootstrap

【PTA】堆中的路径 (25 分)

//法1:通过插入建立最小堆
#include <iostream>
#define MAXN 1010
#define MINDATA -10001
using namespace std;

int H_size=0;
int H_capacity=MAXN;
int* H;

bool IsFull(){
    return (H_size==H_capacity); 
}

void InsertH(int x){
    if(IsFull()) return;
    H_size++;
    int i;
    for(i=H_size;H[i/2]>x;i=i/2){    
        H[i]=H[i/2];
    }
//保证退出来最小下标为1  
    H[i]=x;   
}

void CreateH(){
//建立哨兵
    H[0]=MINDATA;
    int tmp;
    for(int i=1;i<=H_capacity;i++){
        cin>>tmp;
        InsertH(tmp);
    }
}

void PrintL(int index){
    int flag=0;
    for(int i=index;i>0;i=i/2){
        if(flag) printf(" %d",H[i]);
        else{
                 printf("%d",H[i]);
                 flag=1;
        }
    }
}

int main(){
    int M;
    cin>>H_capacity>>M;
    H=new int[H_capacity+1];

    CreateH();

    int tmp;
    for(int i=0;i<M;i++){
        cin>>tmp;
        PrintL(tmp);
        cout<<endl;
    }


    return 0;
}
//由题必须插入因此递归建立的答案会错,但是其实也是最小堆,只是可能是同构的
//法2:通过递归建立最小堆
#include <iostream>
#define MAXN 1010
#define MINDATA -10001
using namespace std;

int H_size=0;
int H_capacity=MAXN;
int* H;

void percDown(int index){
    int x=H[index];
    int parent,child;
    for(parent=index;parent*2<=H_size;parent=child){
        child=parent*2;
        if(child!=H_size && H[child+1]<H[child]){
            child++;
        }
        if(H[child]<x) H[parent]=H[child];
        else break;
    }
    H[parent]=x;
}

void CreateH(){
//建立哨兵
    H[0]=MINDATA;
    for(int i=1;i<=H_capacity;i++){
        cin>>H[i];
        H_size++;
    }

    for(int i=H_size/2;i>0;i--){
        percDown(i);
    }

}

void PrintL(int index){
    int flag=0;
    for(int i=index;i>0;i=i/2){
        if(flag) printf(" %d",H[i]);
        else{
                 printf("%d",H[i]);
                 flag=1;
        }
    }
}

int main(){
    int M;
    cin>>H_capacity>>M;
    H=new int[H_capacity+1];

    CreateH();

    int tmp;
    for(int i=0;i<M;i++){
        cin>>tmp;
        PrintL(tmp);
        cout<<endl;
    }


    return 0;
}
#include <iostream>
#define MAXN 1010
#define MINDATA -10001
using namespace std;

struct HeapStruct
{
    int *Elements;
    int Size;
    int Capicity;
};
typedef HeapStruct* MinHeap;

MinHeap Create(int capicity){
    MinHeap H=new HeapStruct;
    H->Elements=new int[capicity+1];
    H->Elements[0]=MINDATA;

    H->Size=0;
    H->Capicity=capicity;
    return H;
}

bool IsFull(MinHeap H){
    return (H->Size==H->Capicity); 
}

void Insert(MinHeap H,int x){
//插入先判满
    if(IsFull(H)) return;

    H->Size++;
    int i;
    for(i=H->Size;H->Elements[i/2]>x;i=i/2){
        //上滤,插入只会影响一条路径
        H->Elements[i]=H->Elements[i/2];
    }
    H->Elements[i]=x;

}

void PrintL(MinHeap H,int root){
    int flag=0;
   for(int i=root;i>0;i=i/2){
//打印出至根节点的路径
       if(flag) cout<<" "<<H->Elements[i];
       else{
                cout<<H->Elements[i];
                flag=1;
       }
   }
   cout<<endl;
}

int main(){
    int N,M;
    cin>>N>>M;

    MinHeap H=Create(N);

    int tmp;
    for(int i=1;i<=N;i++){
        cin>>tmp;
        Insert(H,tmp);
    }

    for(int i=0;i<M;i++){
        cin>>tmp;
        PrintL(H,tmp);
    }

   
    return 0;
}

;