最小堆和哈夫曼树的建立

本文介绍了浙大数据结构课程中关于最小堆的建立、弹出结点、插入结点的操作,以及哈夫曼树的构建过程。通过数组形式存储完全二叉树,遵循最小堆的结构性和有序性原则。在调整结点后,实现最小堆的建立。弹出结点时,用最后一个叶子结点替换根结点并向下调整。插入结点则是在堆末尾插入并向下过滤。哈夫曼树通过不断合并最小值结点构建,最终形成唯一的根节点。
摘要由CSDN通过智能技术生成

浙大数据结构

用完全二叉树的结构形式组织存储,表现为结构性,任一结点的关键字是其所有子树结点的最大值(称这样的堆为最大堆)或者最小值(称这样的堆为最小堆),表现为有序性
最小堆最大堆
可以按从上往下,从左到右的顺序排序,把二维结构的完全二叉树转换成一维结构的数组进行存储。通过下标进行访问时,任意父结点的下标正好是其左右儿子结点的二分之一倍。
在这里插入图片描述

最小堆的建立

以数组的形式存储了一组数据来表示完全二叉树后,先满足了最小堆的结构性,然后通过调整结点数据才满足最小堆的有序性。
在这里插入图片描述

通过已使用的最后一个数组单元下标访问其父结点,该父结点就是最后一个有儿子的结点,往后都是叶子结点。从最后一个父结点开始往前调整使每一棵子树都满足有序性。
在这里插入图片描述

/* 最小堆的建立 */
void BuilMinHeap(MinHeap *H){
   
	/* BuilMinHeap()使用DeleteMin()相似原理 */
	/* 调整元素使其满足有序性 */ 
	int i;
	i = H->Size/2;
	for(i; i>=1; i--){
   
		DHeap(H, i);
	} 
} 
void DHeap(MinHeap *H, int p){
   
    int Parent, Child;
    ElementType temp;
    temp = H->Elements[p]; //取出根结点 
    for( Parent=p; Parent*2<=H->Size; Parent=Child ) {
   
        Child = Parent * 2;
        if(Child != H->Size && 
		H->Elements[Child]->Weight > H->Elements[Child+1]->Weight)
            Child++;  //Child指向左右子结点的权值较小者 
        if( temp->Weight <= H->Elements[Child]->Weight ) break; //找到了合适位置 
        else H->Elements[Parent] = H->Elements[Child];
    }
    H->Elements[Parent] = temp;
}

弹出(删除)结点

建成最小堆后弹出权值最小结点(根结点)与最小堆的建立使用的方案非常相似。每次弹出根节点后使用最后一个叶子结点填充根节点,再向下过滤寻找适合的位置进行存储。
在这里插入图片描述

/* 弹出(删除)结点 */ 
ElementType DeleteMin(MinHeap *H){
   
	ElementType MinItem, temp;
	int Parent, Child;
	if(H->Size == 0){
   
		cout << "堆空!" << endl;
		return NULL;
	}
	MinItem = H->Elements[1];
	temp = H->Elements[H->Size--];
	for(Parent=1; Parent*2<=H->Size; Parent=Child){
   
		Child = Parent * 2;
		if(H->Size !=
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值