转载:哈夫曼树的构造和哈夫曼编码(C++代码实现)

作者:qiqifanqi 原文:http://blog.csdn.net/qiqifanqi/article/details/6038822

#include<stdio.h>

#define MAX 100

#define MAXVALUE 500

typedef  struct

{  

    int weight;

       int parent,lchild,rchild;

}node; /*哈夫曼树结点类型*/

/*-----------------------------以下部分定义哈夫曼编码存储结构-------------------------*/

typedef struct{

    int start;    //存放起始位置 

    char bits[10+1];    //存放编码位串 

}codetype;

typedef struct{

    char symbol;    //存储字符 

    codetype code;

}element;

void getMinElementLocal(node t[] ,int num , int *minLocal1 , int *minLocal2) ;

/*---------------------------------------------------------------------------------------------------*/

/*构建哈夫曼树。n为构建哈夫曼树的叶子结点个数,数组w存储每个叶子的权值,数组t存储构建好的哈夫曼树*/

void huffman(int n,int w[],node t[])

{

    int m = 0 ;

    int minLocal1 , minLocal2 ;

    int i = 0 ;

    node * nodes = NULL ;

    if(n == 0) return ;

    m = 2*n -1 ;

    for(i = 1 ; i <= n ; i ++){

        t[i].weight = w[i] ;

        t[i].lchild = t[i].parent = t[i].rchild = -1 ;

    }

    for(; i <= m ; i ++){

        t[i].weight = 0 ;

        t[i].lchild = t[i].parent = t[i].rchild = -1 ;

    }

    for(i = 1 ; i <= n-1 ; i ++){

        minLocal1 = minLocal2 = -2 ;

        getMinElementLocal(t , n+i , &minLocal1 , &minLocal2) ;

        t[n+i].weight = t[minLocal1].weight + t[minLocal2].weight ;

        t[n+i].lchild = minLocal1 ;

        t[n+i].rchild = minLocal2 ;

        t[minLocal1].parent = n+i ;

        t[minLocal2].parent = n+i ;    

    }

}

void getMinElementLocal(node t[] ,int num , int *minLocal1 , int *minLocal2){

    int i = 0 ;

    int temp1 = MAXVALUE ;

    int temp2 = MAXVALUE ;

    *minLocal1 = *minLocal2 = 0 ;

    for(i = 1 ; i < num ; i ++){

        if(t[i].weight <= temp1 && t[i].parent == -1){

            temp1 = t[i].weight ;

            *minLocal1 = i ;

        }

    }

    for(i = 1 ; i < num ; i ++){

        if(t[i].weight <= temp2 && t[i].parent == -1 && i != *minLocal1){

            temp2 = t[i].weight ;

            *minLocal2 = i ;

        }

    }

}

/*---------------------------------------------------------------------------------------------------*/

/*根据哈夫曼树,求哈夫曼编码表。tree存储哈夫曼树,table存储哈夫曼编码表,n为哈夫曼树叶子个数*/

void sethufcode(node tree[],element table[],int n)

 {    

    int i,j,s,f;    /* 和f分别指示tree中孩子和双亲的位置*/

       codetype c;/*时存放编码 */

    for(i=1;i<=n;i++)/*次求叶子tree[i]的编码 */

    {    

        printf("%d:",tree[i].weight);

        c.start=n+1;

                s=i;/*叶子tree[i]开始上溯 */

            while(tree[s].parent != -1)/*至上溯到树根为止 */

        {    

            f=tree[s].parent ;

            c.bits[--c.start]= (s == tree[f].lchild)?‘0‘:‘1‘;

               s=f;

             }

            for(j=c.start ;j<n+1;j++)

                      printf("%c",c.bits[j]);

             printf("/n");

             table[i].code=c;/*时编码复制到最终位置 */     

         } 

}

/*---------------------------------------------------------------------------------------------------*/

void main()

{  

    node t[100];

    int i,n,w[100];

    element m[100];

    printf("请输入结点数:");

    scanf("%d",&n);

    for(i=1;i<=n;i++)

    {

        printf("请输入第%d个结点权重:", i);

        scanf("%d",&w[i]);

    }

    /*构造哈夫曼树*/

    huffman(n ,w , t) ;

    printf("序号 权重 双亲 左孩 右孩/n");  /*输出哈夫曼树*/

    for(i=1;i<(2*n);i++)

        printf("%-5d%-5d%-5d%-5d%-5d/n",i,t[i].weight,t[i].parent,t[i].lchild,t[i].rchild);

    sethufcode(t,m,n); /*构造并输出哈夫曼编码表*/

 }
时间: 2024-10-10 09:24:41

转载:哈夫曼树的构造和哈夫曼编码(C++代码实现)的相关文章

哈弗曼树的构建,哈夫曼编码、译码

哈夫曼树的基本概念 哈夫曼树(Huffman Tree),又叫最优二叉树,指的是对于一组具有确定权值的叶子结点的具有最小带权路径长度的二叉树. (1)路劲(Path):从树中的一个结点到另一个结点之间的分支构成两个结点间的路径. (2)路径长度(Path Length):路径上的分支树. (3)树的路径长度(Path Length of Tree):从树的根结点到每个结点的路径长度之和.在结点数目相同的二叉树中,完全二叉树的路径长度最短. (4)结点的权(Weight of  Node):在一些

(源码,具体的细节请查阅相关资料)哈弗曼树的构造以及非递归遍历树

写了一点haffman树的创建和二叉树的非递归遍历. 如果编写代码的时候出现了,思维断点,可以借鉴一下, 避免浪费一些不必要的时间. 我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占 位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我 是占位符我是占位符我是占位符我是占位符我是占位符我是 占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符

哈夫曼树的构造

#include<iostream> #include<string> using namespace std; struct ElemType { char date; int weight; }; struct HTNode { char data; int weight; int parent,lchild,rchild; string code; }; HTNode *createTree(ElemType *w,int n)//哈夫曼树构造 { HTNode *ht=ne

数据结构--树(下)--哈夫曼树与哈夫曼编码

什么是哈夫曼树? 编码这个问题,二进制的形式,等长码.出现频率高的 不登场编码,效率能提高. 将百分制的考试成绩转换成五分制的成绩. 判定树 同一件事情,我们用了不通的判定树,就得出了不同的效率 so........如何根据结点不通的查找频率构造更有效地搜索树?这就是哈夫曼舒要解决的问题. 哈夫曼树的定义: 带权路径长度(WPL):设二叉树有n个叶子节点,每个叶子节点带有权重wk,从根节点到叶子节点的长度为lk,则每个叶子节点的带权路径长度之和就是 哈夫曼树又叫最优二叉树. 哈夫曼树就是让WPL

NOI2015 荷马史诗 [哈夫曼树]

Description 一部<荷马史诗>中有n种不同的单词,从1到n进行编号.其中第i种单 词出现的总次数为wi.Allison 想要用k进制串si来替换第i种单词,使得其满足如下要求: 对于任意的 1 ≤ i, j ≤ n , i ≠ j ,都有:si不是sj的前缀. 现在 Allison 想要知道,如何选择si,才能使替换以后得到的新的<荷马史诗>长度最小.在确保总长度最小的情况下,Allison 还想知道最长的si的最短长度是多少? 一个字符串被称为k进制字符串,当且仅当它的

由二叉树构造赫夫曼树

赫夫曼树: 假设有n个权值{w1,w2,w3....},试构造一棵具有n个叶子节点的二叉树,每个叶子节点带权为wi,则其中带权路径长度最小的二叉树称为最优二叉树或者叫赫夫曼树. 构造赫夫曼树: 假设有n个权值,则构造出的赫夫曼树有n个叶子节点,n个权值分别设置为w1,w2,....wn,则赫夫曼树的构造规则为: 1.将w1,w2...看成是有n棵树的森林: 2.在森林中选择两个根节点的权值最小的树合并,作为一棵新树的左右子树,且新树的根节点权值为其左右子树根节点权值之和: 3.从森林中删除选取的

哈夫曼树(三)之 Java详解

前面分别通过C和C++实现了哈夫曼树,本章给出哈夫曼树的java版本. 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 哈夫曼树的介绍 Huffman Tree,中文名是哈夫曼树或霍夫曼树,它是最优二叉树. 定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树. 这

哈夫曼树(一)之 C语言详解

本章介绍哈夫曼树.和以往一样,本文会先对哈夫曼树的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可.若文章有错误或不足的地方,请帮忙指出! 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 哈夫曼树的介绍 Huffman

【数据结构】赫夫曼树的实现和模拟压缩(C++)

赫夫曼(Huffman)树,由发明它的人物命名,又称最优树,是一类带权路径最短的二叉树,主要用于数据压缩传输. 赫夫曼树的构造过程相对比较简单,要理解赫夫曼数,要先了解赫夫曼编码. 对一组出现频率不同的字符进行01编码,如果设计等长的编码方法,不会出现混淆的方法,根据规定长度的编码进行翻译,有且只有一个字符与之对应.比如设计两位编码的方法,A,B,C,D字符可以用00-11来表示,接收方只要依次取两位编码进行翻译就可以得出原数据,但如果原数据只由n个A组成的,那发出的编码就是2n个0组成,这样的