• 欢迎访问废江's博客 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏本站吧

05-树7 堆中的路径

浙大mooc 站点默认 3周前 (11-27) 7次浏览 已收录 0个评论

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

这是补的之前的一个题,后面发现漏写这一道了,可能因为太简单了把。

#include<iostream>
#include<malloc.h>
typedef struct HNode* Heap; /* 堆的类型定义 */
typedef int ElementType;
using namespace std;
struct HNode {
	ElementType* Data; /* 存储元素的数组 */
	int Size;          /* 堆中当前元素个数 */
	int Capacity;      /* 堆的最大容量 */
};
typedef Heap MaxHeap; /* 最大堆 */
typedef Heap MinHeap; /* 最小堆 */

#define MINDATA -10001  /* 该值应根据具体情况定义为大于堆中所有可能元素的值 */

MaxHeap CreateHeap(int MaxSize)
{ /* 创建容量为MaxSize的空的最大堆 */

	MaxHeap H = (MaxHeap)malloc(sizeof(struct HNode));
	H->Data = (ElementType*)malloc((MaxSize + 1) * sizeof(ElementType));
	H->Size = 0;
	H->Capacity = MaxSize;
	H->Data[0] = MINDATA; /* 定义"哨兵"为大于堆中所有可能元素的值*/

	return H;
}
bool IsFull(MaxHeap H)
{
	return (H->Size == H->Capacity);
}

bool Insert(MaxHeap H, ElementType X)
{ /* 将元素X插入最大堆H,其中H->Data[0]已经定义为哨兵 */
	int i;

	if (IsFull(H)) {
		/*printf("最大堆已满");*/
		return false;
	}
	i = ++H->Size; /* i指向插入后堆中的最后一个元素的位置 */
	for (; H->Data[i / 2] > X; i /= 2)
		H->Data[i] = H->Data[i / 2]; /* 上滤X */
	H->Data[i] = X; /* 将X插入 */
	return true;
}

int main() {
	int n, m, tmp;
	cin >> n >> m;
	MinHeap h;
	h = CreateHeap(10001);
	for (int i = 1; i <=n; i++) {
		cin >> tmp;
		Insert(h, tmp);
	}
	while (m--) {
		cin >> tmp;
		bool flag = true;
		while (tmp) {
			if (!flag)
				cout << " ";
			cout << h->Data[tmp];
			flag = false;
			tmp /= 2;
		}
		cout << endl;
	}
}

个人博客 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:05-树7 堆中的路径
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到