将一系列给定数字插入一个初始为空的小顶堆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
代码如下:
import java.io.BufferedReader;
import java.io.FileDescriptor;
import java.io.FileReader;
/**
* @Description 堆中的路径
*/
public class Main {
//堆中元素个数
private int size;
//要查询的节点数
private int count;
//要查询的节点集合
private int[] print;
public static void main(String[] args){
Main self = new Main();
BufferedReader br = new BufferedReader(new FileReader(FileDescriptor.in));
try {
Heap heap = self.handleInput(br);
for (int i = 0; i < self.print.length; i++) {
StringBuilder sb = heap.printTrace(self.print[i]);
System.out.println(sb.substring(0,sb.length()-1));
}
} catch (Exception e) {
e.printStackTrace();
}
}
public Heap handleInput(BufferedReader br) throws Exception{
String[] s = br.readLine().trim().split(" ");
this.size = Integer.parseInt(s[0]);
this.count = Integer.parseInt(s[1]);
Heap heap = new Heap(size,-10000);
String[] strs = br.readLine().trim().split(" ");
//将数据插入最小堆
for (int i = 0; i < size; i++) {
heap.insert(Integer.parseInt(strs[i]));
}
//读取第三行数据
String[] str3 = br.readLine().trim().split(" ");
this.print = new int[count];
for (int i = 0; i < this.count; i++) {
this.print[i] = Integer.parseInt(str3[i]);
}
return heap;
}
}
class Heap{
private int[] data;
//记录堆中元素个数
private int size;
private int cap;
public Heap(int cap, int min) {
this.data = new int[cap + 1];
this.cap = cap;
this.data[0] = min;
}
//向堆中插入元素
public int insert(int num){
if (++size > cap){
return -1;
}else {
this.data[size] = num;
//与父元素比较,小则互换位置
for (int i = size; this.data[i] < this.data[i/2] ; i /= 2) {
this.data[i] = this.data[i/2];
this.data[i/2] = num;
}
}
return 1;
}
//给出节点位置,打印其在堆上的路径
public StringBuilder printTrace(int num){
StringBuilder sb = new StringBuilder();
if (num <= cap){
for (int i = num; i > 0 ; i/=2) {
sb.append(this.data[i] + " ");
}
}
return sb;
}
}