zoukankan      html  css  js  c++  java
  • 05-树7 堆中的路径

    题目来源:浙大陈越《数据结构》

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

    输入格式:

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

    输出格式:

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

    输入样例:

    5 3
    46 23 26 24 10
    5 4 3
    

    输出样例:

    24 23 10
    46 23 10
    26 10
    思路:基本的堆操作
    代码如下:
    #include<stdio.h>
    #include<stdlib.h>
    /*
    	Name: 给定堆桟元素的路径 
    	Copyright: 
    	Author: demosses
    	Date: 28/04/17 16:03
    	Description: 从给定的元素出发、找父节点、直到根节点 
    */
    
    #define MinData -20000
    typedef int ElementType;
    typedef struct HNode *Heap;
    struct HNode{
    	ElementType *Data;
    	int Size;
    	int Capacity;
    };
    typedef Heap MinHeap;
    MinHeap Create( int MaxSize )
    {   /* 创建容量为MaxSize的空的最大堆 */
    	MinHeap H = malloc( sizeof( struct HNode ) );
    	H->Data = malloc( (MaxSize+1) * sizeof( ElementType ) );
    	H->Size = 0;
    	H->Capacity = MaxSize;
    	H->Data[0] = MinData; /* 定义"哨兵"为小于堆中所有可能元素的值*/
    
    	return H;
    }
    int IsFull(MinHeap H)
    {
    	if(H->Size>H->Capacity )
    	  return 1;
    	else
    	  return 0;  
    	  
    }
    void Insert( MinHeap H, ElementType item )
    { /* 将元素item 插入最大堆H,其中H->Elements[0]已经定义为哨兵 */
        int i;
     
    	if ( IsFull(H) ) { 
            printf("最大堆已满");
            return;
        }
    
    	i = ++H->Size; /* i指向插入后堆中的最后一个元素的位置 */
    	for ( ; H->Data[i/2] > item; i/=2 )
            H->Data[i] = H->Data[i/2]; /* 向下过滤结点 */
    	H->Data[i] = item; /* 将item 插入 */
    }
    void road(MinHeap H,int X)
    {
    	int flag=1;
    	for(;X>0;X=X/2)
    	  if (flag==1)
    	      printf("%d",H->Data[X],flag=0);
    	      
    	  else
    	     printf(" %d",H->Data[X]);
    }
    int main()
    {
    	int N,L,X,LL;
    	MinHeap A;
    	scanf("%d",&N);
    	scanf("%d",&L);
    	A=Create(10001);
    	for(;N>0;N--)
    	{
    	   scanf("%d",&X);
    	   Insert(A,X);
    	} 
    	for(;L>0;L--)
    	{
    	   scanf("%d",&LL);
    	   road(A,LL);
    	   printf("
    ");
    	} 
    	return 0;
    }


  • 相关阅读:
    Day1_Python基础
    选择排序(java版)
    冒泡排序(java版)
    手写数据库连接池(动态代理)
    JDBC增删查改(使用配置文件)
    JDBC demo
    JSP入门&会话技术
    response实现验证码图片
    android 定制自己的日志工具
    服务的最佳实践——后台执行的定时任务
  • 原文地址:https://www.cnblogs.com/jacksin/p/8830220.html
Copyright © 2011-2022 走看看