算法导论-第19章-二项堆

本文深入探讨了二项堆的概念,包括可合并堆、二项树及其性质,以及二项堆的定义、结构和操作。同时,提供了相关代码实现,并给出了一系列针对二项堆的练习和思考题,涉及二项堆与二项树的关系、操作验证以及在最小生成树算法中的应用。
摘要由CSDN通过智能技术生成

一、概念

1.可合并堆

(1)可合并堆应支持的操作

MAKE-HEAP()
INSERT(H, x)
MINIMUM(H)
EXTRACT-MIN(H)
UNION(H1, H2)
(2)二项堆是一种可合并堆

2.二项树

(1)二项树的定义

二项树是Bk一种递归定义的有序树
B0只包含一个结点
Bk(k>0)由两棵二项树B|k-1连接而成,其中一棵作为另一棵的左孩子

(2)二项树Bk的性质

a.共有2^k个结点
b.树的高度为k
c.在深度i处恰有C(i, k)个结点
d.树的度数为k,它大于任何其它结点的度;并且,如果根的子女从左到右编号为k-1, k-1, ……, 0,子女i是子树Bi的根

(3)二项树的结构

用左孩子用兄弟的方法表示二项树

(4)二项树的举例



3.二项堆

(1)二项堆的定义与性质

(2)二项堆的结构

(3)二项堆提供的操作


二、代码

Binomial_Heap.h

#include <iostream>  
using namespace std;  
  
//二项堆结点结构  
struct node  
{  
    int key;//关键字  
    int data;//卫星数据  
    node *p;//指向父结点的指针,父或左兄  
    node *child;//指向左孩子的指针  
    node *sibling;//指向右兄弟的指针  
    int degree;//度  
    //初始化  
    node(int n, node *nil):key(n),p(nil),child(nil),sibling(nil),degree(0){}  
};    
  
//二项堆结构  
class Binomial_Heap  
{  
public:  
    node *head;  
    node *nil;  
    //构造函数  
    Binomial_Heap(){nil = new node(-1, nil);}  
    Binomial_Heap(node *NIL){nil = NIL;}  
    //19.2  
    void Make_Binomial_Heap();  
    node* Binomial_Heap_Minimum();  
    void Binomial_Link(node *y, node *z);  
    node *Binomial_Heap_Merge(Binomial_Heap *H1, Binomial_Heap *H2);  
    void Binomial_Heap_Union(Binomial_Heap *H2);  
    void Binomial_Heap_Insert(node *x);  
    node* Binomial_Heap_Extract_Min();  
    void Binomial_Heap_Decrease_Key(node *x, int k);  
    void Binomial_Heap_Delete(node *x);  
};  

//构造一个空的二项堆
void Binomial_Heap::Make_Binomial_Heap()
{
	//初始化对象
	head = nil;
}
//寻找最小关键字
node* Binomial_Heap::Binomial_Heap_Minimum()
{
	//最小关键字一定位于某个二项树的根结点上
	node *x = head, *y = nil;
	int min = 0x7fffffff;
	//遍历每个二项树的根结点
	while(x != nil)
	{
		//找出最小值
		if(x->key < min)
		{
			min = x->key;
			y = x;
		}
	
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值