zoukankan      html  css  js  c++  java
  • 堆中的路径

    将一系列给定数字插入一个初始为空的小顶堆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

    我的代码(C++)

    #include <iostream>
    #define ElementType int
    
    typedef struct HNode *Heap; /* 堆的类型定义 */
    struct HNode {
    	ElementType *Data; /* 存储元素的数组 */
    	int Size;          /* 堆中当前元素个数 */
    	int Capacity;      /* 堆的最大容量 */
    };
    typedef Heap MinHeap; /* 最小堆 */
    
    /*MinHeap->Data[0]不使用,也不作为“岗哨”*/
    MinHeap creatHeap(int Capacity) {
    	MinHeap minHeap = (MinHeap)malloc(sizeof(struct HNode));
    	minHeap->Data = (ElementType *)malloc((Capacity+1)*sizeof(ElementType));
    	minHeap->Size = 0;
    	minHeap->Capacity = Capacity;
    	return minHeap;
    }
    void insert(Heap MinHeap,int X) {
    	if (MinHeap->Size >= MinHeap->Capacity) return; //堆已满
    	int i = ++MinHeap->Size;
    	for (; i>1 && X < MinHeap->Data[i / 2]; i=i/2) {
    		MinHeap->Data[i] = MinHeap->Data[i / 2];
    	}
    	MinHeap->Data[i] = X;
    }
    
    int main()
    {
    	int N, M,i,j,X;
    	scanf("%d %d",&N,&M);
    	MinHeap H = creatHeap(N);
    	for (i=0;i<N;i++)
    	{
    		scanf("%d",&X);
    		insert(H,X);
    	}
    	for ( i = 0; i < M; i++)
    	{
    		scanf("%d", &j);
    		printf("%d", H->Data[j]);
    		while (j > 1) {
    			j /= 2;
    			printf(" %d",H->Data[j]);
    		}
    		printf("
    ");
    	}
    	return 0;
    }
    
  • 相关阅读:
    Java序列化原理
    分库分表
    数据库索引
    监听TCP端口号:从简单Socket到NIO到Netty
    如何保证缓存与数据库的双写一致性
    代理模式:静态代理、JDK动态代理、Cglib动态代理
    Redis发布订阅(Pub-Sub)模式
    Redis分片机制(Sharding)
    Redis高可用性:主从、哨兵和集群
    Redis简介
  • 原文地址:https://www.cnblogs.com/TangYJHappen/p/13267157.html
Copyright © 2011-2022 走看看