05-树7 堆中的路径 (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、小根堆插入新结点的寻找插入位置的方法(vector的下表作为树中结点的位置,方便计算父结点)
#include <iostream> #include <vector> using namespace std; #define Min_Value -10001 //比小根堆所有结点的值更小的值用来判断插入堆时已到达根结点 #define Max_Node 10000 void Insert_MinHeap(int value,vector<int> &Heap,int &size)//插入一个数值进入小根堆 { size++;//小根堆结点个数加一 int sequence=size;//当前小根堆最后一个结点的位置 while (Heap[sequence/2]>value)//向上判断插入位置 { Heap[sequence]=Heap[sequence/2]; sequence /=2; } Heap[sequence]=value; } int main() { int N=0,M=0; int size=0; cin>>N>>M; int value=0; vector<int> Heap(Max_Node); Heap[0]=Min_Value; while (N--) { cin>>value; Insert_MinHeap(value, Heap, size); } int check_num=0,flag=0; while (M--) { cin>>check_num; flag=0; while (check_num!=0) { if (flag==0) { cout<<Heap[check_num]; flag=1; }else { cout<<' '<<Heap[check_num]; } check_num /=2; } if (M!=0) { cout<<endl; } } return 0; }