7-5 堆中的路径(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、用一个数组和一个size维护一个最小堆,数组和size均为全局变量,size指示当前数组的大小。
2、调用insert函数建立最小堆,先把新插入的节点放到最末尾,再循环跟父节点比较。
import java.util.Scanner;
public class Main {
private static int a[] ;
private static int size=0;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int n =in.nextInt() ;
int m = in.nextInt();
a = new int [n+1];
a[0]=Integer.MIN_VALUE;
for(int i = 0; i<n; i++) {
int num = in.nextInt();
insert(num);
}
for(int i =0; i<m;i++) {
int j = in.nextInt();
dayin(j);
}
}
private static void dayin(int j) {
// TODO Auto-generated method stub
int flag= 0;
while(j!=0) {
if(flag!=0)
System.out.print(" ");
System.out.print(a[j]);
flag=1;
j=j/2;
}
System.out.println();
}
private static void insert(int num) {
// TODO Auto-generated method stub
int i =++size;
a[i]=num;
while(num<a[i/2]) {
a[i]=a[i/2];
a[i/2]=num;
i=i/2;
}
}
}