05-树7 堆中的路径 (25分)
思路分析:
题目的意思是输入节点值,要把这个节点构成最小堆,可以采取两个思路,一个是动态插入,也就是插入一个就马上构成一个最小堆,这样的话会用到最小堆的插入算法,也就是每插入一个数先暂时在最后生成一个节点,运用完全二叉树的性质,父亲节点为 (i/2),来比较大小,如果要插入的树小于父节点,那么将父节点移动到新生成的这个节点,我们用数组来实现,每要生成节点,那么这个节点的位置就是这个二叉树的规模。
第二个方法就是先按照生成完全二叉树的办法将每一个节点无序放入,然后从最后一个节点的父亲开始采取向下过滤的方式来交换
#include <iostream>
#define MaxSize 1001
#define MinSize -10001
using namespace std;
int MinHeap[MaxSize];
int Size;
void BuildMinTree(int m);
int main()
{
MinHeap[0] =MinSize ;
Size = 0;
int InputNum,PrintPath,PrintNode,Value;
int i =0;
cin >> InputNum >> PrintPath;
for(i = 1;i<=InputNum;i++)
{
cin >> Value;
BuildMinTree(Value);
}
for(i = 0;i<PrintPath;i++)
{
cin >> PrintNode;
cout << MinHeap[PrintNode];
while(PrintNode>1)
{
PrintNode/=2;
cout << " " <<MinHeap[PrintNode];
}
cout<<endl;
}
return 0;
}
void BuildMinTree(int m)
{
int j = 0;
if(Size>=MaxSize) return;
Size++;
for(j = Size;MinHeap[j / 2] > m;j/=2)MinHeap[j] = MinHeap[j/2];
MinHeap[j] = m;
}