知识点前言
一、搞清楚概念
●权:___________
●带权路径长度:__________
WPL=所有的叶子结点的权值*路径长度之和
●前缀编码:____________
二、构造哈夫曼树
n个带权值的结点,构造哈夫曼树算法:
1、转化成n棵树组成的森林F
2、构造新结点B,取森林里权值最小的两颗作为新结点的左右子树,新权值=左权值+右权值
3、删除F中被选择的两颗树,加上新生成的借点B
4、重复以上步骤,直到F中只有一颗树为止
三、哈夫曼树的性质
1每个初始节点最终都会成为叶子节点,权值越小,路径长度越大
2构造过程中新建了n-1个节点,节点总数2n-1 =n-1+n;
3哈夫曼树中不存在度为1的节点
一、构造哈夫曼树
题目:已知节点和他们出现的频率,构造哈夫曼树算法
/******已知哈夫曼树n个节点的权值表,构造哈夫曼树**********/
/*******依据哈夫曼树,产生哈夫曼编码************/
代码框架:
cs/********实现哈夫曼树的构造***********/ /* 思考 1、如何存储?链式?顺序? 2、借助一个性质: 二叉树中叶子结点数量n,度为2的节点数量n-1,总结点数:2n-1 3、节点结构?? */ /*定义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);