25.5.4数据结构|哈夫曼树 学习笔记
知识点前言
一、搞清楚概念
●权:___________
●带权路径长度:__________
WPL=所有的叶子结点的权值*路径长度之和
●前缀编码:____________
二、构造哈夫曼树n个带权值的结点,构造哈夫曼树算法:
1、转化成n棵树组成的森林F
2、构造新结点B,取森林里权值最小的两颗作为新结点的左右子树,新权值=左权值+右权值
3、删除F中被选择的两颗树,加上新生成的借点B4、重复以上步骤,直到F中只有一颗树为止
三、哈夫曼树的性质
1每个初始节点最终都会成为叶子节点,权值越小,路径长度越大
2构造过程中新建了n-1个节点,节点总数2n-1=n-1+n;
3哈夫曼树中不存在度为1的节点
一、构造哈夫曼树
题目:已知节点和他们出现的频率,构造哈夫曼树算法
/******已知哈夫曼树n个节点的权值表,构造哈夫曼树**********/
/*******依据哈夫曼树,产生哈夫曼编码************/
代码框架:
/********实现哈夫曼树的构造***********/ /* 思考1、如何存储?链式?顺序?2、借助一个性质:二叉树中叶子结点数量n,度为2的节点数量n-1,总结点数:2n-13、节点结构?? */ /*定义huffman树的节点结构,采用顺序存储,存储索引号*/ typedef struct{int weight;//节点的权值int lchild,rchild;//左右孩子的索引号int parent;//父节点的索引号 }HafumanNode,*HafumanTree;/******已知n个哈夫曼树的权值表,构造哈夫曼树**********/ HafumanTree createHafumanTree(const int *w,int n); void releaseHuffmanTree(HafumanTree tree); typedef char *hafumancode; /*******依据哈夫曼树,产生哈夫曼编码************/ hafumancode *createHafumancode(HafumanTree tree,int n); void releaseHafumancode(hafumancode *codes,int n);