05-树7 堆中的路径

//05-树7 堆中的路径

import java.util.Scanner;


class heap{
    final int Max_Size = 1000;
    final int Min_Data = -10000;
    int[] elements= new int[Max_Size + 1];
    int size = 0;
    int capacity = Max_Size;
    heap(){
        this.elements[0] = Min_Data;

    }
}

public class Main {
    static void percdown(heap H, int p){
        int x = H.elements[p];
        int par, chi;

        for(par = p; par * 2 < H.size; par = chi){
            chi = 2 * par;
            if((chi != H.size) && (H.elements[chi] > H.elements[chi + 1])){
                chi ++;
            }
            if(x < H.elements[chi]){
                break;
            }
            else{
                H.elements[par] = H.elements[chi];
            }
        }
        H.elements[par] = x;
    }

    static void buildMin(heap H){
        int p = H.size / 2;
        for(; p >= 1; p --){
            percdown(H, p);
        }

    }
    static void buildMin(int[] a, heap H){
        int j;
        for(int i = 0; i < a.length; i ++){
            j = ++ H.size;
            H.elements[j] = a[i];
            for(;H.elements[j / 2] > a[i]; j /= 2){
                H.elements[j] = H.elements[j / 2];
            }
            H.elements[j] = a[i];
        }
    }

    static void printstack(heap H, int p){
        while(p > 0){
            if(p == 1){
                System.out.print(H.elements[p]);
            }
            else{
                System.out.print(H.elements[p] + " ");
            }
            p /= 2;
        }
        System.out.println();
    }

    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        int N = s.nextInt();
        int M = s.nextInt();
        int p;
        int[] a = new int[N];
        heap H = new heap();
        for(int i = 0; i < N; i ++){
            a[i] = s.nextInt();
            //H.elements[i + 1] = a[i];
            //H.size ++;
        }
        /*for(int i = 1; i < N + 1; i ++){
            System.out.println(H.elements[i] + " ");
        }
        buildMin(H);
        for(int i = 1; i < N + 1; i ++){
            System.out.println(H.elements[i]);
        }*/
        buildMin(a, H);
        for(int i = 0; i < M; i ++){
            p = s.nextInt();
            printstack(H, p);
        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值