Huffman树的实现
来源:互联网 发布:网络免费赚钱项目 编辑:程序博客网 时间:2024/05/17 01:34
假设给定一个有n个权值的集合{w1,w2,w3,…,wn},其中wi>0(1<=i<=n)。若T是一棵有n个叶结点的二叉树,而且将权值w1,w2,w3…wn分别赋值给T的n个叶结点,则称T是权值为w1,w2,w3…wn的扩充二叉树。带有权值的叶节点叫着扩充二叉树的外结点,其余不带权值的分支结点叫做内结点。外结点的带权路径长度为T的根节点到该结点的路径长度与该结点上的权值的乘积。n个外结点的扩充二叉树的带权路径长度为
Huffman树构造算法:
1、由给定的n个权值{w1,w2,w3,…,wn}构造n棵只有根节点的扩充二叉树森林F={T1,T2,T3,…,Tn},其中每棵扩充二叉树Ti只有一个带权值wi的根节点,左右孩子均为空。
2、重复以下步骤,直到F中只剩下一棵树为止:
a、在F中选取两棵根节点的权值最小的扩充二叉树,作为左右子树构造一棵新的二
叉树。将新二叉树的根节点的权值为其左右子树上根节点的权值之和。
b、在F中删除这两棵二叉树;
c、把新的二叉树加入到F中;
最后得到的就是Huffman树。
对次可以借助小堆来创建Huffman树当堆中只有一个节点是这个节点就是Huffman树的根
堆的实现上一篇博文已经讲过本文不在多说http://blog.csdn.net/dakuan_chen/article/details/72884960
#define _CRT_SECURE_NO_WARNINGS 1#pragma once#include "heap.hpp"#include <string>#include <stack>#include <memory>#include <stdio.h>template<class T>struct HuffmanNode{ HuffmanNode(const T& weight) : _weight(weight) , _pLeft(NULL) , _pRight(NULL) , _pParent(NULL) {} HuffmanNode<T>* _pLeft; HuffmanNode<T>* _pRight; HuffmanNode<T>* _pParent; T _weight; T _data;};template<class T>class HuffmanTree{public: HuffmanTree() : _pRoot(NULL) {} HuffmanTree(const T array[], size_t size, const T& invalue) { _Create(array, size, invalue); } HuffmanNode<T>* GetRoot() { return _pRoot; } // ~HuffmanTree() // { // Destory(_pRoot); // }private: void Destory(HuffmanNode<T>* pRoot) { Destory(pRoot->_pLeft); Destory(pRoot->_pRight); delete pRoot; } struct Compare { bool operator()(const HuffmanNode<T>* pLeft, const HuffmanNode<T>* pRight) { return pLeft->_weight < pRight->_weight; } }; void _Create(const T array[], size_t size, const T& invalue) { assert(array); Heap<HuffmanNode<T>*, Compare> hp; for (size_t i = 0; i < size; i++) { if (array[i] != invalue) { HuffmanNode<T>* ptmp = new HuffmanNode<T>(array[i]); hp.Push(ptmp); } } while (hp.Size()>1) { HuffmanNode<T>* pLeft = hp.Top(); hp.Pop(); HuffmanNode<T>* pRight = hp.Top();; hp.Pop(); HuffmanNode<T>* pParent = new HuffmanNode<T>(pRight->_weight + pLeft->_weight); pParent->_pLeft = pLeft; pParent->_pRight = pRight; pLeft->_pParent = pParent; pRight->_pParent = pParent; hp.Push(pParent); } _pRoot = hp.Top(); }protected: HuffmanNode<T>* _pRoot;};
阅读全文
0 0
- Huffman树的实现
- Huffman树的实现
- Huffman树的实现
- Huffman树的简单实现
- 【C++】Huffman树的实现
- Huffman树的建立(c++实现)
- Huffman树的建立(c++实现)
- Huffman树结构的实现(上)
- Huffman树结构的实现(下)
- Huffman编码树的Java实现
- huffman树( c++) 的三种实现
- 用Huffman树实现文本的压缩
- Huffman树的定义与实现
- huffman(哈夫曼)树的实现
- Huffman编码树的C++实现
- Huffman树及编码的实现
- Huffman编码的实现
- huffman表的实现
- 二叉树 链表实现 模板
- Anaconda 打开 ipynb 文件并可设置路径
- 链表实现冒泡排序
- 初步理解client/server
- OpenGL蓝宝书源码学习(十三)第六章——OpenGL着色器和着色语言
- Huffman树的实现
- Multiply Strings
- Application Structure 应用结构
- Linux文件编程
- 获取URL参数
- java线程池与五种常用线程池策略使用与解析
- org.apache.ibatis.binding.BindingException spring springMVC mybatis 整合
- 闪回表+查看和修改撤销表空间的信息+闪回表操作语法+闪回表的案例
- Linux 链接命令(ln)