05-树7 堆中的路径 (25分)

题目描述

在这里插入图片描述

输入样例:
5 3
46 23 26 24 10
5 4 3
输出样例:
24 23 10
46 23 10
26 10

注意点

1. x = ++i; 与x = i ++;
  • i++和++i是C语言运算符,i++是后缀递增的意思,++i是前缀递增的意思。

  • i++是后缀递增的意思,i++是先进行表达式运算,再进行自增运算。把i++的运算过程拆分开,等效于i=i+1可以看到运算结果是一致的。

  • x = i ++; //先让x变成i的值1,再让i加1

  • ++i是前缀递增的意思,++i是先进行自增或者自减运算,再进行表达式运算。运算结果可以发现,仅从i的值来看,++i和i++最终的i值是一样的,都是i自增加了1。

  • x = ++i; //先让i加1, 再让x变成i的值1

基础功不怎么样,知道调试才发现错误。

哨兵

  • 数组的第1个元素(Data[0])为哨兵,给他设置个最小值(最小堆);
  • 当我们进行插入时,当我们发现父节点的值大于要插入的值时,就进入循环;若要插入的值要放在最上面时(Data[1]),此时,Data[1]与哨兵进行比较,由于哨兵我们给他设置了很小的值,因此循环结束。
  • 除了哨兵的方法,我们也可以加一个条件。当i>1,时,循环继续,当i=1时,直接将插入的值放到Data[1]的位置。
#include <stdio.h>
#include <stdlib.h>
#define MinData -1000 /* 该值应根据具体情况定义为小于堆中所有可能元素的值 */
typedef int ElementType ;
typedef struct HNode *Heap; /* 堆的类型定义 */
struct HNode{
	ElementType *Data; /* 存储元素的数组 */
	int Size; /* 堆中当前元素个数 */
	int Capacity; /* 堆的最大容量 */
};

typedef Heap MinHeap;
MinHeap CreateHeap(int MaxSize);
bool IsFull(MinHeap H);
void Insert(MinHeap H,int data);
void PrintPath(MinHeap H,int index);
MinHeap ReadHeap(MinHeap H,int N);
MinHeap PrintHeap(MinHeap H,int M);
int main()
{
	int N,M;
	MinHeap H;
	scanf("%d %d",&N,&M);
	H = CreateHeap(N);
	ReadHeap(H,N);
	PrintHeap(H,M);
}

MinHeap CreateHeap(int MaxSize)
{
/* 创建容量为MaxSize的空的最小堆 */
	MinHeap H = (MinHeap)malloc(sizeof(struct HNode));
	H->Capacity = MaxSize;
	H->Size = 0;
	H->Data = (ElementType *)malloc((MaxSize+1)*sizeof(ElementType));
	H->Data[0] = MinData; /* 定义"哨兵"为小于堆中所有可能元素的值*/
	
	return H;
}
bool IsFull(MinHeap H)
{
	return (H->Size == H->Capacity);
}
void Insert(MinHeap H,int data)
{
/* 将元素data插入最小堆H,其中H->Data[0]已经定义为哨兵 */
	int i;
	if(IsFull(H))
	{
		printf("the heap is full.\n");
	}
	else
	{
		// 先让size加1,再赋给i   
		i = ++H->Size; /* i指向插入后堆中的最后一个元素的位置,也就是要插入的位置 */
		for(;H->Data[i/2] > data;i/= 2)
		{
			// 将父元素放到下面来 
			H->Data[i] = H->Data[i/2];
		}
		H->Data[i] = data; /* 将X插入 */
		
	}
}
MinHeap ReadHeap(MinHeap H,int N)
{
	int i;
	int data;
	for (i = 0;i < N; i++)
	{
		scanf("%d",&data);
		Insert(H,data);
	}
	
	return H;
}
void PrintPath(MinHeap H,int index)
{
	int i;
	for(i = index;i!=0;i/=2)
	{
		printf("%d ",H->Data[i]);
	}
}
MinHeap PrintHeap(MinHeap H,int M)
{
	int i;
	int index;
	for (i = 0; i < M;i++)
	{
		scanf("%d",&index);
		PrintPath(H,index);
		if(i!=(M-1)) printf("\n");
	}
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程小白呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值