Code前端首页关于Code前端联系我们

哈夫曼树(最优二叉树)简介和C语言代码实现

terry 2年前 (2023-09-27) 阅读数 76 #数据结构与算法

1。简介

哈夫曼树(Huffman Tree)又称:最优二叉树、哈夫曼树

其标准。含义是:给定N个权重作为N个叶子节点,构造一棵二叉树。如果树的带权路径长度达到最小值,这样的二叉树称为最优二叉树,也称为哈夫曼树。哈夫曼树是带权路径长度最短的树,权重越大的节点越靠近根。

2。相关名词

由于本文有一定的难度,在开始相关学习之前,请先巩固一下本文涉及的以下名词知识点。

a) 路径:在树中,一个节点和另一个节点之间的路径称为路径。

b) 路径长度:在路径中,每经过一个节点,样式长度就加1。例如,在一棵树中,如果根节点的级别为1,那么从节点开始的路径长度根节点到第 i 个节点的值在 - 1 中。

c) 节点权重:为每个节点分配一个新的值,称为该节点的权重。

d) 节点的带权路径长度:指从根节点到该节点的路径长度与该节点权重的乘积。

e) 树的加权路径长度是树中所有叶节点的加权路径长度之和。通常标记为“WPL”。

3。构建哈夫曼树

构建哈夫曼树时,只需遵循一个原则,即权重较大的节点距离树的根较近。

因此,在构造过程中,有以下规则:

哈夫曼树(最优二叉树)的介绍及C语言代码实现

首先选择我们数据中最小的两个数据来构造二叉树的左子树和右子树,根数据为他们俩。

哈夫曼树(最优二叉树)的介绍及C语言代码实现

哈夫曼树(最优二叉树)的介绍及C语言代码实现

其次,使用刚刚合成的数据作为正确的子项。左子节点选择原始数据中最小的作为左子节点。它们的根也是左右子节点的权重和

哈夫曼树(最优二叉树)的介绍及C语言代码实现

重复上述步骤,直到处理完所有数据并构造出二叉树。这棵二叉树就是我们的霍夫曼树。

如图所示,这棵哈夫曼树的WPL值为:WPL= 8*1+ 6*2 + 1*3 + 4*3 = 273

4。哈夫曼树 节点结构

与一般二叉树没有显着区别。甚至可以说结构一模一样。由于性别值的原因,必须使用parent来访问父节点

。代码表示为:

//哈夫曼树节点结构 typedef struct int 重量; //节点权重 int parent, left, right; //父节点、左子节点、右子节点在矩阵中的位置下标 } HTNo de, *HuffmanTree;

其中权重是节点权重,

5。构建哈夫曼树

通过上面的分析,我们可以知道,构建哈夫曼树时,需要根据每个节点的权重值,过滤掉权值最小的两个节点,构建二叉树。

代码为:

//HT为存储地址发送的哈夫曼树的矩阵,w为存储节点权重值的矩阵,n为节点数voidCreateHuffmanTree(HuffmanTree *HT, int *w, ❀n) { 如果(n 左 = 0; =p+i; }//初始化哈夫曼树的节点,除了树组下标n+1开始的叶子节点之外 ( int i = n +1; i 权重 = 0;) 父 = 0; (p+i) ->左 = 0; (p+i)->右 = 0;} / 构​​建哈夫曼树 for() int i 选择(*HT, i-1, &s1, &s2); //要查找内容,您必须使用搜索算法
(*HT)[i].left = s1; .(right =)[i2] ; ) [ s1].weight + (*HT)[s2].weight;}}

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门