首页 > 其他分享 >[数据结构] 哈夫曼树

[数据结构] 哈夫曼树

时间:2023-02-01 23:34:37浏览次数:55  
标签:结点 哈夫曼 最小 二叉树 heap 权值 数据结构

哈夫曼树

哈夫曼树简介

给定 N 个权值作为 N 个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树( Huffman Tree )。

哈夫曼树涉及的基本概念

路径和路径长度

在一棵树中,从一个结点往下可以达到的孩子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第 L 层结点的路径长度为 L - 1

树的带权路径长度

设二叉树具有 n 个带权叶结点,从根结点到各叶结点的路径长度与相应叶节点权值的乘积之和称为 树的带权路径长度(Weighted Path Length of Tree,WPL )。

w 为二叉树第 i 个叶结点的权值,l 为从根结点到第 i 个叶结点的路径长度,则 WPL 计算公式如下:

对于给定一组具有确定权值的叶结点,可以构造出不同的二叉树,其中,WPL 最小的二叉树称为哈夫曼树。
其叶结点权值越小,离根越远,叶结点权值越大,离根越近。

哈夫曼树的构建

哈夫曼树的构建思路

(1)将给定的 n 个节点构建成一个二叉树(初始情况下单个节点看成是一颗二叉树)的集合;
(2)每次在集合中选取最小权值的两个二叉树根节点,并将这两个二叉树将最小的一个作为左子树,次小的一个作为右子树,合并成一个新的二叉树;
(3)将取出的最小的两个二叉树从集合中删除,并将新的二叉树加入到集合中;
(4)重复步骤(2)、(3),最后集合中只剩下一个二叉树时,哈夫曼树构建完成。

构建哈夫曼树图解

(1)

初始化二叉树集合

(2)

最小的 1 和 3 合并为 4

(3)

最小的 4 和 4 合并为 8

(4)

最小的 5 和 6 合并为 11

(5)

最小的 7 和 8 合并为 15

(6)

最小的 9 和 11 合并为 20

(7)

最小的 15 和 20 合并为 35

(8)

计算 WPL

哈夫曼树相关试题

哈夫曼树

Acwing 3531.哈夫曼树

#include<iostream>
#include<queue>
#include<vector>
#include<functional>
using namespace std;

int n, ans = 0;
priority_queue<int, vector<int>, greater<int> > heap;  //小根堆

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    
    cin>>n;
    while(n--){
        int x; cin>>x;
        heap.push(x);
    }
    
    while(heap.size() > 1){
        int a = heap.top();
        heap.pop();
        int b = heap.top();
        heap.pop();
        
        ans += a + b;
        heap.push(a + b);
    }
    cout<<heap.top()<<endl;
    cout<<ans;
}

标签:结点,哈夫曼,最小,二叉树,heap,权值,数据结构
From: https://www.cnblogs.com/MAKISE004/p/17084223.html

相关文章

  • 数据结构——最大堆
    一、堆堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:堆中某个节点的值总是不大于或不小于其父节点......
  • 数据结构——优先队列
    一、优先队列优先队列顾名思义,就是优先权最大的排在队列的头部,而优先权的判断是根据对象的compare方法比较获取的,保证根节点的优先级一定比子节点的优先级大。所以放入到优......
  • 数据结构——线段树
    一、概述线段树是一种二叉搜索树,其存储的是一个区间的信息,每个结点以结构体的形式去存储,每个结构体包含三个元素:区间左端点、区间右端点、该区间要维护的信息(视实际情况而......
  • 数据结构——Trie
    一、Trie字典树在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位......
  • 数据结构——并查集
    一、并查集的概念在计算机科学中,并查集是一种树形的数据结构,用于处理不交集的合并(union)及查询(find)问题。 并查集可用于查询网络中两个节点的状态,这里的网络是......
  • 数据结构——AVL树
    一、平衡二叉树平衡二叉树也称平衡二叉搜索树(Self-balancingbinarysearchtree)是一种结构平衡的二分搜索树。 平衡二叉树由二分搜索树发展而来,在二分搜索树的基础上......
  • 数据结构——红黑树
    前言红黑树是计算机科学内比较常用的一种数据结构,它使得对数据的搜索,插入和删除操作都能保持在O(㏒n)的时间复杂度。然而,相比于一般的数据结构,红黑树的实现的难度有所增加......
  • 数据结构——Hash表
    前言Hash表也叫散列表,是一种线性数据结构。在一般情况下,可以用o(1)的时间复杂度进行数据的增删改查。在Java开发语言中,HashMap的底层就是一个散列表。一、什么是Hash表Ha......
  • 数据结构——动态数组
    简介数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。因此可以通过索引(Index)计算出某个元素的地址。 数组特点索引(即下标)......
  • 数据结构——队列
    简介队列是是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 队列是一种先进先出的线性表,简称FIFO允许插入的以端称为队尾,允许删除的一端被称为队头。入......