PTA数据结构-05-树7 堆中的路径

本文介绍了一种使用Java实现小顶堆的方法,并详细解释了如何构建小顶堆以及如何从指定节点到根节点的路径。通过实例演示,文章展示了如何处理一系列数字的插入操作,并在给定下标的情况下,输出从该下标节点到根节点的路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题目

将一系列给定数字插入一个初始为空的小顶堆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.util.*;
//考虑如何建堆,堆特点:儿子n*2,父亲n/2
public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int len = sc.nextInt();
        int findLen = sc.nextInt();
        int[] heap = createHeap(len, sc);
        for (int i = 0; i < findLen; i++) {
            printPath(sc.nextInt(), heap);
        }
    }
    public static int[] createHeap(int len, Scanner sc){
        int[] heap = new int[len + 1]; //heap[0]作为哨兵不放数据,从1开始放更方便2*n操作
        heap[0] = Integer.MIN_VALUE;
        for (int i = 0; i < len ; i++) append(i+1, sc.nextInt(), heap);
        return heap;
    }
    public static void append(int index, int num, int[] heap){
        //heap[0]作为哨兵不放数据,从1开始放更方便2*n操作
        heap[index] = num;
        while (heap[index] < heap[index/2]){
            int temp = heap[index];
            heap[index] = heap[index/2];
            heap[index/2] = temp;
            index /= 2;
        }
    }
    public static void printPath(int index, int[] heap){
        String res = "";
        while (index > 0){
            res += heap[index] + " ";
            index /= 2;
        }
        System.out.println(res.trim());
    }
}

思路:

  1. 关键在于堆的特点以及建堆:设置heap[0]为哨兵,则2N为父亲,N/2为儿子
  2. 考虑如何建堆
  3. 考虑如何往堆中添加元素:不断与父亲比较,然后交换位置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值