介绍
这篇文章主要讲解了C语言怎么实现哈夫曼树的构建,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。
哈夫曼树(霍夫曼树)又称为最优的树。
<强> 1,路径和路径长度强>
在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L - 1。
<强> 2,结点的权及带权路径长度强>
若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。
<强> 3,树的带权路径长度强>
树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL
# include & lt; stdio.h> # include & lt; stdlib.h> # include & lt; string.h>/*哈夫曼树的结构体*/typedef struct stHuNode { int数据;//权值 struct stHuNode * lchild, * rchild; }HUNODE;/* *找出权值数组里面,最小的两个权值下标 *函数请参:HUNODE * pArray[]存放节点的指针数组 int数n组里面的元素个数 int * p1存放最小权值的下标 int * p2存放第二小权值的下标 */int findSmallData (HUNODE * pArray [], int, int * p1, int * p2) { int指数=0; int fir_small=0 xffff sec_small=0 xffff; 如果(pArray==NULL) { 返回1; } (指数=0;指数& lt;n;指数+ +) {/*当前的下标下面是有节点的*/如果(pArray(指数)!=NULL) { 如果(pArray(指数)→数据& lt;fir_small) { sec_small=fir_small; fir_small=pArray(指数)→数据; * p2=* p1; * p1=指数; } else if (pArray(指数)→数据& lt;sec_small) { sec_small=pArray(指数)→数据; * p2=指数; } } } 返回0; }/* *函数功能:构建哈夫曼树 *函数请参:int *权值数组 int n这个数组里面有多少个数据 */HUNODE * createHuTree (int *, int n) { int指数=0; int fir_small=0, sec_small=0;/*定义一个指针数组,最大是100 */HUNODE * pArray [100]; HUNODE * pNewNode=零;/*先创建n个根节点*/memset (pArray 0 sizeof (HUNODE) * n); (指数=0;指数& lt;n;指数+ +) { pNewNode=(HUNODE *) malloc (sizeof (HUNODE)); memset (pNewNode 0 sizeof (HUNODE)); pNewNode→数据=https://www.yisu.com/zixun/a(指数); pNewNode -> lchild=零; pNewNode -> rchild=零;/*把这个节点存放在指针数组中去*/pArray(指数)=pNewNode; }/*构建哈夫曼树*/(指数=0;指数data=pArray [fir_small] ->数据+ pArray [sec_small] ->数据;/*最小的是左孩子,第二小的是右孩子*/pNewNode -> lchild=pArray [fir_small]; pNewNode -> rchild=pArray [sec_small];/*把新的节点放入到指针数组里面去*/pArray [fir_small]=零; pArray [sec_small]=pNewNode; } 返回pNewNode; }/*前序遍历该二叉树*/空白preOrderHuffMan (HUNODE *根) { 如果(根) { printf (" % d”,根->数据); preOrderHuffMan(根-> lchild); preOrderHuffMan(根-> rchild); } } int main () { int [4]={7、5、2、4}; HUNODE *根=零;/*构建哈夫曼树*/根=createHuTree (4);/*前序遍历*/preOrderHuffMan(根); printf ("/n”); 返回0; }
看完上述内容,是不是对C语言怎么实现哈夫曼树的构建有进一步的了解,如果还想学习更多内容,欢迎关注行业资讯频道。