关闭

数据结构-哈夫曼(Huffman)

标签: 数据结构最优二叉树
208人阅读 评论(0) 收藏 举报
分类:


#include <iostream>
#include <cstdio>
#include <malloc.h>
#define LIST_INIT_SIZE 10
#define LISTINCREMENT 100
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAX 0xcfcfcfcf
using namespace std;

typedef struct
{
    unsigned int weight;
    unsigned int parent, lchild, rchild;
} HTNode, *HUffmanTree;
void select(HUffmanTree HT, int n, int *s1, int *s2);
void found(HUffmanTree ht, int i, int j, char *c);
void HUffmanCoding(HUffmanTree *HT, int *w, int n);

int main()
{
    char c[10];
    int w[10] = {5,29,7,8,14,23,3,11};
    HUffmanTree HT;
    HUffmanCoding(&HT,w,8);//8是数组长度
    for(int i=0; i<8; i++) printf("%d%c",w[i],i==7?'\n':' ');
    found(HT,14,0,c);//14是树根所在位置
    return 0;
}


void select(HUffmanTree HT, int n, int *s1, int *s2)
{
    unsigned int min1, min2;
    min1 = min2 = MAX;
    for(int i = 0; i < n; i++)
    {
        if(HT[i].weight <= min1&& !HT[i].parent)
        {
            min2 = min1;
            *s2 = *s1;
            min1 = HT[i].weight;
            *s1 = i;
        }
        else if(HT[i].weight < min2&& !HT[i].parent)
        {
            min2 = HT[i].weight, *s2 = i;
        }
    }
}

void found(HUffmanTree ht, int i, int j, char *c)
{
    if(ht[i].lchild==0 && ht[i].rchild==0)
    {
        c[j] = '\0';
        printf("i:%-2d w:%-2d char:%s\n", i, ht[i].weight, c);
        return;
    }
    c[j] = '1';
    found(ht,ht[i].lchild,j+1,c);
    c[j] = '0';
    found(ht,ht[i].rchild,j+1,c);
    return;
}

void HUffmanCoding(HUffmanTree *HT, int *w, int n)
{
    int s1, s2;
    if(!n) return;
    *HT = (HUffmanTree)malloc((2*n)*sizeof(HTNode));
    HUffmanTree p = *HT;
    for(int i = 0; i< n; i++)
    {
        p[i].lchild = p[i].rchild = p[i].parent = 0;
        p[i].weight = w[i];
    }
    for(int i =n; i < 2*n; i++)
    {
        p[i].weight = p[i].lchild = p[i].rchild = p[i].parent = 0;
    }
    for(int i = n; i < 2*n-1; i++)
    {
        select(*HT, i, &s1, &s2);
        p[s1].parent = i, p[s2].parent = i;
        p[i].lchild = s1, p[i].rchild = s2;
        p[i].weight = p[s1].weight + p[s2].weight;
    }
    printf("Weight parent lchild rchild\n");
    for(int i = 0; i < 2*n-1; i++)
        printf("   %-4d  %-4d   %-4d   %-4d\n",p[i].weight, p[i].parent, p[i].lchild, p[i].rchild);
    printf("----------------------------------\n");
    return;
}



0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

【数据结构与算法】 哈夫曼树——哈夫曼编码的一个实例

哈夫曼树和哈夫曼编码
  • TW_345
  • TW_345
  • 2015-11-29 15:47
  • 11225

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

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

哈夫曼编码译码(数据结构课程设计)

1.需求分析 1.1问题描述 设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。 1.2 基本要求 将权值数据存放在数据文件(文件名为data.txt,位于执行程序的...
  • u011710873
  • u011710873
  • 2014-03-19 18:24
  • 2854

数据结构 哈夫曼树huffman

  • 2010-10-26 11:07
  • 3KB
  • 下载

※数据结构※→☆非线性结构(tree)☆============哈夫曼树 链式存储结构(tree Huffman list)(二十三)

哈夫曼树 (Huffman Tree)         给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。...
  • xiaoting451292510
  • xiaoting451292510
  • 2013-10-10 10:43
  • 41667

※数据结构※→☆非线性结构(tree)☆============哈夫曼树 顺序存储结构(tree Huffman sequence)(二十二)

哈夫曼树 (Huffman Tree) 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。 ...
  • xiaoting451292510
  • xiaoting451292510
  • 2013-10-08 11:19
  • 39919

  数据结构-C语言-哈夫曼树

  • 2017-05-04 17:19
  • 5KB
  • 下载

数据结构 作业哈夫曼、排序二叉树

  • 2009-03-09 02:35
  • 2KB
  • 下载

数据结构哈夫曼树实验代码

  • 2016-02-18 18:58
  • 928KB
  • 下载

数据结构上级作业哈夫曼

  • 2012-11-05 22:15
  • 72KB
  • 下载
    个人资料
    • 访问:9819次
    • 积分:438
    • 等级:
    • 排名:千里之外
    • 原创:34篇
    • 转载:3篇
    • 译文:0篇
    • 评论:2条
    文章分类