优先级队列实现哈夫曼树的编码和译码

//优先级队列实现的哈夫曼树的编码和译码   

#include<iostream>
#include<queue>
#include<string>
using namespace std;    

class Node
{
public:
    float weight;
    Node* left;
    Node* right;
    char ch;    

    Node(float w,Node* l=NULL,Node* r=NULL,char c=' '):weight(w),ch(c),left(l),right(r) {}
    Node(float w,char c=' '):weight(w),ch(c),left(NULL),right(NULL) {}
};    

class cmp
{
public :
    bool operator()(Node* a,Node* b)
    {
        return a->weight>b->weight;
    }
};  

vector<int> v;
void Encode(Node* r)//打印字符的编码
{
    if(r->left==NULL && r->right==NULL)
    {
        cout << r->ch <<": ";
        for (int i = 0;i<v.size();++i)
            cout << v[i];
        cout << endl;
        v.pop_back();
        return ;
    }
    if(r->left)
    {
        v.push_back(0);
        Encode(r->left);
    }
    if(r->right)
    {
        v.push_back(1);
        Encode(r->right);
    }
    if(!v.empty())
    {
        v.pop_back();
    }
}    

void Decode(Node* root, string s)//译码
{
    Node* p=root;
    for(int i=0;i<s.length();++i)
    {
        if(s[i]=='0')
        {
            if(p->left) p=p->left;
            else
            {
                cout<<s<<" Can't decode!"<<endl;
                return ;
            }
        }
        if(s[i]=='1')
        {
            if(p->right) p=p->right;
            else
            {
                cout<<s<<" Can't decode!"<<endl;
                return ;
            }
        }
    }
    cout<<s<<": "<<p->ch<<endl;
}    

void freeTree(Node* p)//销毁哈夫曼树
{
    if(p->left!=NULL)
        freeTree(p->left);
    if(p->right!=NULL)
        freeTree(p->right);
    delete p;
    p=NULL;
}    

int main()
{
    Node* m1,*m2;
    char ch[]={'A','C','E','D','F','G'};//字符
    float f[]={0.1,0.3,0.4,0.5,0.2,0.6};//频率       

    priority_queue<Node*,vector<Node*>,cmp> q;
    int n=sizeof(ch)/sizeof(ch[0]);
    for(int i=0;i<n;++i)
    {
        q.push(new Node(f[i],ch[i]));
        cout<<ch[i]<<": "<<f[i]<<'\t';
    }
    cout<<endl;
    for(int i=1;i<n;++i)
    {
        m1=q.top(); q.pop();
        m2=q.top(); q.pop();
        float w=m1->weight+m2->weight;
        q.push(new Node(w,m1,m2));
    }
    Node* root=q.top();
    Encode(root);
    cout<<endl;
    Decode(root,"1011");
    freeTree(root);    

    return 0;
}  

 

作者:阿凡卢

出处:http://www.cnblogs.com/luxiaoxun/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

http://www.cnblogs.com/luxiaoxun/archive/2012/08/04/2622626.html

时间: 2024-08-04 00:34:55

优先级队列实现哈夫曼树的编码和译码的相关文章

c++构建哈夫曼树-用c++构建一个哈夫曼树

问题描述 用c++构建一个哈夫曼树 输入字符个数,权值,打印哈夫曼树,编码和译码,源代码,可以用c-free运行的那种,求各位大神帮忙解答,要完整的代码拜托了 解决方案 http://wenku.baidu.com/link?url=soJMJxpwqcyygmDD3--Q8O4FUz2v7fjaZbwzWL04tAFjGbaTBoVBI49LIa5XIAfGODAr5UQdu_fHjXZnGWoDMuvnUKsjIBSolWTCbB2dL8i 解决方案二: http://download.cs

用c++构造哈夫曼树-用c++构建一个哈夫曼树

问题描述 用c++构建一个哈夫曼树 可以输入字符个数和权值,中间要有层次遍历,带头文件,打印哈夫曼树,编码和译码,有源代码,可以用c-free运行的那种,求各位大神帮忙解答,要完整的代码拜托了 解决方案 http://download.csdn.net/detail/amini_qiang/9231621 看看这个满足你的需要不,可在vs2010中直接运行

解析C++哈夫曼树编码和译码的实现_C 语言

一.背景介绍: 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近. 二.实现步骤: 1.构造一棵哈夫曼树 2.根据创建好的哈夫曼树创建一张哈夫曼编码表 3.输入一串哈夫曼序列,输出原始字符 三.设计思想: 1.首先要构造一棵哈夫曼树,哈夫曼树的结点结构包括权值,双亲,左右孩子:假如由n个字符来构造一棵哈夫曼树,则共有结点2n-1个:在构造前,先初始化

哈夫曼树及哈夫曼编码

         一,引言          如上图,是一个判断体重在什么范围内的判定树,例如,学校体检的时候,我们反复用这个算法,当你输入一个体重:200斤,然后程序就开始反复判断了,经过三次判断,它发现你过重,然后重启系统了,又来一个人,还是200斤,三次判断之后,又系统重启了-后面的200多个200多斤的盘子判断完了之后,来了个120的,终于是个比较正常的体重了,但是系统一判断完,系统还是重启,反复检查之后,发现你那台8086时代的电脑终于撑不住了~      于是你改了下算法,换了一棵判

数据结构-----哈夫曼树的构造以及遍历

/* 根据Huffman树的构造原理进行构造 ... 哈夫曼树在编码压缩的领域有很好的应用,利用Huffman进行编码可以保证数据传输 的无二义性 . 但是要注意的是 对于出现频率大的数据我们应该尽量放在离根节点近的地方进行编码 , 出现频率小的数据我们可以放在距离根节点小的地方. 这样可以提高数据的传输效率 . */ #include "stdio.h" #include "malloc.h" ///节点声明 typedef struct node{ node *

经典算法题每日演练——第十三题 赫夫曼树

       赫夫曼树又称最优二叉树,也就是带权路径最短的树,对于赫夫曼树,我想大家对它是非常的熟悉,也知道它的应用场景, 但是有没有自己亲手写过,这个我就不清楚了,不管以前写没写,这一篇我们来玩一把.   一:概念  赫夫曼树里面有几个概念,也是非常简单的,先来看下面的图: 1. 基础概念 <1>  节点的权: 节点中红色部分就是权,在实际应用中,我们用"字符"出现的次数作为权. <2>  路径长度:可以理解成该节点到根节点的层数,比如:"A&quo

一步一步写算法(之哈夫曼树 上)

原文:一步一步写算法(之哈夫曼树 上) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com]       在数据传输的过程当中,我们总是希望用尽可能少的带宽传输更多的数据,哈夫曼就是其中的一种较少带宽传输的方法.哈夫曼的基本思想不复杂,那就是对于出现频率高的数据用短字节表示,对于频率比较低得数据用长字节表示.     比如说,现在有4个数据需要传输,分别为A.B.C.D,所以一般来说,如果此时没有考虑四个数据出现的概率,那么我们完全可以这么分配

HDU2527 构建哈夫曼树的灵巧运用

上课老师说了知道哈夫曼树叶子 不构图求二叉树的权 就是在构造哈夫曼树的时候运用构图的方法 把 每个结点的值加起来就是该数的权 证明 W=∑叶子权*该叶子层数 除了叶子的结点和就是这个树的权  构造一个树就知道了 结点的权 肯定是下一层结点的和 就好像  W=∑叶子权*该叶子层数 这个公式运用了 乘法分配律一样=  =  #include <iostream> #include<cstdio> #include<cstring> #include<algorithm

数据结构——赫夫曼树

1 基本概念 赫夫曼树(Huffman Tree)又称为最优树,是一类带权路径长度最短的树.本文仅讨论最优二叉树. 树的路径长度是指从树根到树中其余各个结点的路径长度之和.对具有n个结点的二叉树而言,完全二叉树具有最短的树的路径长度. 若在二叉树中,树叶结点带有权值,则有:结点的带权路径长度定义为从树根到该结点之间的路径长度与该结点上所带权值之积. 若树中有n个树叶结点,且每个树叶结点均带有权值,则有:树的带权路径长度定义为树中所有树叶结点的带权路径长度之和,可记为: 有时,也将树的路径长度称为