05-树6. Path in a Heap (25)

<span style="background-color: rgb(250, 250, 250); font-family: 'Droid Sans', Verdana, 'Microsoft YaHei', Tahoma, sans-serif; line-height: 1em;"><span style="font-size:32px;">05-树6. Path in a Heap (25)</span></span>

  
  
时间限制
150 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue

Insert a sequence of given numbers into an initially empty min-heap H. Then for any given index i, you are supposed to print the path from H[i] to the root.

Input Specification:

Each input file contains one test case. For each case, the first line gives two positive integers N and M (<=1000) which are the size of the input sequence, and the number of indices to be checked, respectively. Given in the next line are the N integers in [-10000, 10000] which are supposed to be inserted into an initially empty min-heap. Finally in the last line, M indices are given.

Output Specification:

For each index i in the input, print in one line the numbers visited along the path from H[i] to the root of the heap. The numbers are separated by a space, and there must be no extra space at the end of the line.

Sample Input:
5 3
46 23 26 24 10
5 4 3
Sample Output:
24 23 10
46 23 10
26 10

思路:完全依葫芦画瓢何头的讲解,非常简单,通过循环比较插入结点和其父结点,遇到哨兵的时候推出循环,找到新结点的插入位置插入就好。
代码:
#include<iostream>
using namespace std;

#define MaxData -10001
#define ElementType int 

typedef struct HeapStruct *MaxHeap;
struct HeapStruct{
	ElementType *Elements;
	int size;
	int Capacity;
};

MaxHeap CreateHeap(int MaxSize);
void Insert_Heap(MaxHeap H, int item);
void Output(MaxHeap H,int n);

int main(int argc, char*[])
{
	int n, m;
	cin >> n >> m;
	MaxHeap H = CreateHeap(n);
	for (int i =1 ; i <=n; i++)
	{
		int data;
		cin >> data;
		Insert_Heap(H, data);
	}
	
	for (int i = m; i > 0; i--)
	{
		int num;
		cin >> num;
		Output(H,num);
	}

	system("pause");
	return 0;
}

MaxHeap CreateHeap(int MaxSize)
{
	MaxHeap H =(MaxHeap)malloc(sizeof(struct HeapStruct));
	H->Elements =(int *) malloc((MaxSize + 1)*sizeof(ElementType));
	H->size = 0;
	H->Capacity = MaxSize;
	H->Elements[0] = MaxData;//因为要建最小堆,因此在0地址存最小数作为哨兵
	return H;
}

void Insert_Heap(MaxHeap H, int item)
{
	int i;
	if (H->size == H->Capacity)
	{
		cout << "最大堆以满"<<endl;
		return;
	}
	i = ++H->size;
	for (; H->Elements[i / 2] > item; i /= 2)
	{
		H->Elements[i] = H->Elements[i / 2];
	}
	H->Elements[i] = item;
}

void Output(MaxHeap H,int n)
{
	for (int i = n; i > 0; i /= 2)
	{
		cout << H->Elements[i];
		if (i == 1)
			cout << endl;
		else
			cout << " ";
	}
}

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值