堆中的路径

来源:互联网 发布:考研大数据 编辑:程序博客网 时间:2024/06/07 13:21

将一系列给定数字插入到一个初始为空的最小堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。

输入样例:

5 3
46 23 26 24 10
5 4 3

输出样例:

24 23 10
46 23 10
26 10

以下是代码及分析:

#include <iostream>using namespace std;#define MAX 1001 //因为根结点从下标为1的地方开始,所以最大长度设为1001#define MIN -10001int H[MAX],size;  //size表示当前堆的大小//Create建立一个空堆void Create(){    size = 0;    H[0] = MIN;  //因为根结点是从下标为一的地方开始,所以0这个地方是空缺的。此处将H[0]设为最小值,下面插入操作方便(不会产生越界)}//插入操作,从下往上作比较void Insert(int X){    int i;    //因为是最小堆,所以父结点H[i/2]比子树小    for(i = ++ size; H[i/2] > X; i /= 2){        H[i] = H[i/2];    }  //如果H[i/2]比X大,就用i/=2把i挪到上一个位置去    H[i] = X;  //如果退出循环,就是父结点<=X,当前位置就是要插入的位置}int main(){    int n,m,x,i,j;    cin>>n>>m;    Create();  //堆初始化    for(i = 0;i < n;i++){        cin>>x;        Insert(x);    }  //读入并建堆    //接下来的循环,每次循环都读入一个数,作为待查找的位置    for(i = 0;i < m;i++){        cin>>j;        cout<<H[j];  //先打印这个位置的元素值        while(j>1){   //j这个位置到根结点的所有祖先都打印出来            j /= 2;            cout<<" "<<H[j];        }        cout<<endl;    }    return 0;}
1 0
原创粉丝点击