哈夫曼树及编码

原创 2006年05月16日 20:55:00

哈夫曼树(huffman)是最优的二叉树,它的编码也是唯一的,不会有歧义,不过这个程序有点不好,它的编码好像并不是我所想象的那样,不过在以后我会慢慢把它解决,如果你可以也可以帮我完善一下哦!

/*在VC++里要删去getch()涵数和clrscr()涵数,可能是不支持吧!*/
/*win-tc*/
#include"stdio.h"
#include"stdlib.h"
#include"conio.h"
#include"malloc.h"
#define Num 20
typedef struct huffmanNode  /*定义结点*/
{
    int weight;
    int parent;
    int lchild;
    int rchild;
}huffmanNode;
huffmanNode huffmanTree[2*Num-1];
char* huffmanCode[Num];

void HuffmanCoding(int n);
void Select(int n,int* s1,int* s2);
void CreateHuffmanTree(int data[],int len);
void main()
{
    int i;
    int index=0;
    int value;
    int nodelist[Num];
    clrscr();            /*清屏涵数*/
    printf("/nplease input the elements of binary tree(Exit for 0):/n/n");
    index=0;
    scanf("%d",&value);
    while(value!=0)         /*输入叶子的权值,以0结束*/
    {
        nodelist[index]=value;
        index++;
        scanf("%d",&value);
    }
    CreateHuffmanTree(nodelist,index);
    HuffmanCoding(index);
    for(i=0;i<index;i++)
    {
        printf("/n%3d: [",huffmanTree[i].weight);
        printf("%s",huffmanCode[i]);
        printf("]");
    }
    getch();         /**/
}

void Select(int n,int* s1,int* s2)
{
    int i;
    if(n<2)
        return;
    for(i=0;i<n;i++)
    {
        if(huffmanTree[i].parent==0)
        {
            *s1=i;
            break;
        }
        for(i=0;i<n;i++) /*选出第一个权值最小的结点*/
        {
            if(huffmanTree[*s1].weight>huffmanTree[i].weight)
                *s1=i;
        }
    }
    for(i=0;i<n;i++)
    {
        if((huffmanTree[i].parent==0)&&(*s1!=i))
        {
            *s2=i;
            break;
        }
    }
    for(i=0;i<n;i++)  /*选出第二个权值最小的结点*/
    {
        if((huffmanTree[i].parent==0)&&(*s1!=i))
        {
            if(huffmanTree[*s2].weight>huffmanTree[i].weight)
                *s2=i;
        }
    }
}

/*创建*/
void CreateHuffmanTree(int data[],int len)
{
    int i;
    int m;
    int s1=0,s2=0;
    m=2*len-1;
    for(i=0;i<len;i++)
    {
        huffmanTree[i].weight=data[i];
    }
    for(i=len;i<m;i++)
    {
        Select(i,&s1,&s2);
        huffmanTree[s1].parent=i;  /*置父结点*/
        huffmanTree[s2].parent=i;
        huffmanTree[i].lchild=s1; /*生成新结点*/
        huffmanTree[i].rchild=s2;
        huffmanTree[i].weight=huffmanTree[s1].weight+huffmanTree[s2].weight;
    }
}

/*编码*/
void HuffmanCoding(int n)
{
    int i,j;
    int start;
    int current,father;
    char* cd=(char*)malloc(n*sizeof(char));
    cd[n-1]='/0';
    for(i=0;i<n;i++)
    {
        start=n-1;
        current=i;
        father=huffmanTree[i].parent;
        while(father)
        {
            if(huffmanTree[father].lchild==current)
                cd[--start]='0';  /*父结点的左边设为0*/
            else
                cd[--start]='1';  /*父结点的左边设为1*/
            current=father;
            father=huffmanTree[father].parent;
        }
        huffmanCode[i]=(char*)malloc((n-start)*sizeof(char));
        strcpy(huffmanCode[i],&cd[start]);
    }
    free(cd);
}
结果如下:

哈夫曼树的创建和编码

哈夫曼树的创建和编码                    1.哈夫曼树又称最优二叉树,是一类带权路径长度最短的树。        对于最优二叉树,权值越大的结点越接近树的根结点,权值越小的结点越远...
  • wp1603710463
  • wp1603710463
  • 2016年03月19日 21:30
  • 11758

数据结构(15)--哈夫曼树以及哈夫曼编码的实现

1.哈夫曼树     假设有n个权值{w1, w2, ..., wn},试构造一棵含有n个叶子结点的二叉树,每个叶子节点带权威wi,则其中带权路径长度WPL最小的二叉树叫做最优二叉树或者哈夫曼树。  ...
  • u010366748
  • u010366748
  • 2016年03月01日 17:28
  • 6254

数组实现哈夫曼树及哈夫曼编码

百度百科介绍:http://baike.baidu.com/link?url=DDUm7qBwh4XVGlhskrXjpQZx6mu74iy-54mkIBMUIME8o22OKvbi61yHxOz0L...
  • somehow1002
  • somehow1002
  • 2015年11月27日 16:43
  • 1188

数据结构之构造哈夫曼树及哈夫曼编码

一、实验目的 1、了解哈夫曼树的概念,掌握哈夫曼树的存贮结构和构造方法。 2、掌握哈夫曼树构造的算法,掌握哈夫曼树编码的形成及特点。 二. 实验内容与要求 1.设计哈夫曼树的存贮结构。 2....
  • y20110220y
  • y20110220y
  • 2013年12月15日 10:54
  • 915

数据结构之---C语言实现哈夫曼树和编码

数据结构之---C语言实现哈夫曼树和编码
  • u012965373
  • u012965373
  • 2015年07月03日 00:03
  • 6055

哈夫曼树及哈夫曼树编码

本文转自哈夫曼树及哈夫曼树编码 在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN) 树和哈夫曼编码。哈夫曼编码是哈夫曼树的一个应用。哈夫曼编码应用广泛,...
  • WHEgqing
  • WHEgqing
  • 2015年09月09日 15:50
  • 334

哈夫曼树和编码

一,什么是哈夫曼树 什么是哈夫曼树呢? 哈夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树。下面用一幅图来说明。 它们的带权路径长度分别为: 图a: WPL=5*...
  • fynjy
  • fynjy
  • 2015年08月05日 21:34
  • 739

哈夫曼树构造及编码

哈夫曼树: 树的带权路径长度是树中所有叶子结点的带权路径长度之和。一组具有确定权值的叶结点可以构成多个带权二叉树。带权路径长度最小的二叉树就称作最优二叉树,或者哈夫曼树。通过实践可以发现,哈夫曼树总...
  • theArcticOcean
  • theArcticOcean
  • 2015年06月22日 23:42
  • 1727

哈夫曼树编码C语言实现

实现哈夫曼树编码的算法可分为两大部分: (1)构造哈夫曼树; (2)在哈夫曼树上求叶结点的编码; 哈夫曼树构造算法: (1)由给定的n个权值构造n棵只有一个叶结点的二叉树,从而得到一个二叉树的集合F=...
  • qq_29187355
  • qq_29187355
  • 2017年05月06日 01:46
  • 861

【数据结构】哈夫曼树实现编码译码

根据一段字符串中字符的个数 作为该字符的权值生成哈夫曼树。        然后根据生成的哈夫曼编码,对任意字符串实现编码,对任意二进制串实现译码。 程序运行结果: 1.程序主界面: 2.根据字...
  • a781558066
  • a781558066
  • 2015年01月07日 22:16
  • 6779
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:哈夫曼树及编码
举报原因:
原因补充:

(最多只允许输入30个字)