C++,练习6-1 堆中的路径

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

输入格式:

每组测试第 1 行包含 2 个正整数 nm (≤103),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间 [−104,104] 内的 n 个要被插入一个初始为空的小顶堆的整数。最后一行给出 m 个下标。

输出格式:

对输入中给出的每个下标 i,在一行中输出从第 i 个结点到根结点的路径上的数据。数字间以 1 个空格分隔,行末不得有多余空格。

输入样例:

5 3
46 23 26 24 10
5 4 3

输出样例:

24 23 10
46 23 10
26 10
#include <iostream>
#include <vector>
#include <algorithm>
void printPath(std::vector<int>& tree,int index){
    while(index>1){
        std::cout<<tree[index]<<' ';
        index/=2;
    }
    if(index == 1){
        std::cout<<tree[index]<<std::endl;
    }else{
        std::cout<<"error"<<std::endl;
    }
}
int main(){
    int size,outCount;
    std::cin>>size>>outCount;
    std::vector<int> tree(size+1);
    tree[0] = -1;
    for(int i = 1;i<=size;i++){
        std::cin>>tree[i];
        int j = i;
        while(j>1 && tree[j]<tree[j/2]){
            std::swap(tree[j],tree[j/2]);
            j/=2;
        }  
    }
    //默认从小到大排序
    // std::sort(tree.begin()+1,tree.end());

    for(int i = 0;i<outCount;i++){
        int index;
        std::cin>>index;
        printPath(tree,index);
    }
}
posted @ 2025-01-02 18:50  Kazuma_124  阅读(37)  评论(0)    收藏  举报