二项树和二项堆(Binomial Heaps)

本文介绍了二项树Bk的定义及其性质,包括结点数量、树高及各深度结点的数量等特征。此外,还介绍了由一组遵循特定规则的二项树构成的数据结构——二项堆。

二项树Bk是一种递归定义的有序树。二项树B0只包含一个结点。二项树Bk由两个子树Bk-1连接而成:其中一棵树的根是另一棵树的根的最左孩子。

二项树

二项树Bk具有以下性质:

1)共有2k次方个结点;

2)树的高度为k

3)在深度i处恰有(k,i)(因此叫二项树)个结点,其中i=0,...,k

4)根的度数为k,它大于任何其他结点的度数,并且,如果对根的子女从左到右编号为k-1k-2,...0,子女i是子树Bi的根。

证明:略,请参考《算法导论》第十九章。

 

二项堆H由一组二项树构成,但需要满足下面两个性质:

1H中的每个二项树遵循最小堆的性质:结点的关键字大于等于其父结点的关键字。

2)对于任意非负整数k,在H中至多有一棵二项树的根具有度数k

二项堆

1、抽象数据类型定义如下: 本程序主要定义了两个类,一个用于创建节点,另一个用于创建二项。 class BinomialHeapNode { public: int key; //节点的关键字的值 int degree; //节点的度 BinomialHeapNode* sibling; //节点的右兄弟节点 BinomialHeapNode* child; //节点的最最孩子节点 BinomialHeapNode* father; //节点的双亲节点 BinomialHeapNode(int newkey) ; //构造函数,以关键字创建节点 BinomialHeapNode(); //重载构造函数,默认关键字为0 }; class BinomialHeap { public: typedef BinomialHeapNode node_t; private: static BinomialHeap heapMerge(BinomialHeap& heapA, BinomialHeap& heapB) ; //将两个二项按照根的度的递增顺序构成一个新的二项 static void nodeLink(node_t* child, node_t* father) ; //将两个节点连接成二项 public: node_t* head; //二项的头节点 BinomialHeap(); //构造函数,头结点为0 { head = 0 } BinomialHeap(node_t& node) //构造函数,以一个节点进行构造 { head = &node; } BinomialHeap(node_t* node) //构造函数,以一个节点进行构造 { head = node; } BinomialHeap(const BinomialHeap& src) //构造函数,以一个二项进行构造 { head = src.head; } inline void insertNode(node_t& node) ; //在中插入一个节点 void insertNode(node_t* node) ; //在中插入一个节点 node_t* Find_Min(); //查找关键字值最小的节点 node_t* Extract_Min(); //查找并删除关键字值最小的节点 static BinomialHeap heapUnion(BinomialHeap& heapA, BinomialHeap& heapB) ; //合并两个二项 node_t*Findnode(int key) ; //查找关键字为key的节点 inline void swapkey(node_t* source,node_t*target ) ; //交换两个节点的关键字的值 void decreaseKey(int key,int newkey) ; //减小关键字为key的节点的值为newkey void traverse(); //遍历二项 void DeleteNode(int key) ; //删除关键字为key的节点 };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值