【数据结构】Huffman树

参照书上写的Huffman树的代码 结构用的是线性存储的结构 不是二叉链表 里面要用到查找最小和第二小 理论上锦标赛法比较好 但是实现好麻烦啊
考虑到数据量不是很大 就直接用比较笨的先找最小 去掉最小再找第二小的方法了。


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct{
unsigned int weight;
unsigned int parent, lchild, rchild;
}HTNode, *HuffmanTree;

typedef char ** HuffmanCode;

int Select(HuffmanTree HT, int n, int &s1, int &s2)
{
if(n <= 1) return 1;
else
{
int i;
s1 = 0; s2 = 0;
for(i = 1; i <= n; i++)
{
if(s1 == 0 && HT[i].parent == 0)
{
s1 = i;
}
else if(HT[i].parent == 0 && HT[i].weight < HT[s1].weight && s1 != 0)
{
s1 = i;
}
}
for(i = 1; i <= n; i++)
{
if(i == s1)
{
continue;
}
else if(s2 == 0 && HT[i].parent == 0)
{
s2 = i;
}
else if(HT[i].parent == 0 && HT[i].weight < HT[s2].weight && s2 != 0)
{
s2 = i;
}
}
}
return 0;
}
void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int * w, int n)
{
if(n <= 1) return;
int m = 2 * n - 1;
HuffmanTree p;
int i;
HT = (HuffmanTree)malloc((m + 1) * sizeof(HTNode));
for(p = HT, i = 1; i <= n; i++, p++, w++) //初始化
{
p->weight = *w; p->parent = 0; p->rchild = 0; p->lchild = 0;
}
for( ; i <= m; i++, p++)
{
p->weight = 0; p->parent = 0; p->rchild = 0; p->lchild = 0;
}

for(i = n + 1; i <= m; i++) //建Huffman树
{
int s1, s2;
Select(HT, i - 1, s1, s2);
HT[s1].parent = i; HT[s2].parent = i;
HT[i].lchild = s1; HT[i].rchild = s2;
HT[i].weight = HT[s1].weight + HT[s2].weight;
HT[i].parent = 0; //不加这句会出错
}

HC = (HuffmanCode)malloc((n + 1) * sizeof(char *));
char * cd = (char *)malloc(n * sizeof(char));
cd[n - 1] = ‘\0‘;
for(i = 1; i <= n; i++)
{
int start = n - 1;
int c, f;
for(c = i, f = HT[i].parent; f != 0; c = f, f = HT[f].parent)
{
if(HT[f].lchild == c) cd[--start] = ‘0‘;
else{ cd[--start] = ‘1‘;}
}
HC[i] = (char *)malloc((n - start) * sizeof(char));
strcpy(HC[i], &cd[start]);
}
free(cd);
}

int main()
{
int N = 10; //一共10个权值
int w[10] = {1,2,3,4,5,6,7,8,9,0};
HuffmanTree HT;
HuffmanCode HC;
HuffmanCoding(HT, HC, w, N);

int i, j;
for(i = 1; i <= N; i++)
{
printf("%d: ", i);
for(j = 0; HC[i][j] != ‘\0‘; j++)
{
printf("%c", HC[i][j]);
}
printf("\n");
}

return 0;
}

【数据结构】Huffman树

时间: 2024-10-08 07:45:22

【数据结构】Huffman树的相关文章

6月11日数据结构——Huffman树

对于Huffman树最终该输出什么不清楚 #include<stdio.h> #include<stdlib.h> #define leafNumber 20 //默认权值集合大小 #define totalNumber 39 //数结点个数=2*leafNumber-1 typedef struct { char data; //结点的值 int weight; //结点的权 int Parent,lchild,rchild; //双亲.左.右子女结点指针 }HTNode; ty

数据结构之Huffman树与最优二叉树

最近在翻炒一些关于树的知识,发现一个比较有意思的二叉树,huffman树,对应到离散数学中的一种名为最优二叉树的路径结构,而Huffman的主要作用,最终可以归结到一种名为huffman编码的编码方式,使用huffman编码方式,我们可以以平均长度最短的码字来记录一串信息,且每个信息分子的编码唯一,独立.从而最终合成编码所对应的信息唯一,无歧义. huffman树的创建时基于每个信息分子都拥有其权重,权重越大,越靠近树根,即路径越短, 下面我们我们来以一个huffman树的例子为例:简单引入一下

数据结构之huffman树

#include <stdio.h> #include<stdlib.h> #define MAXBIT      99 #define MAXVALUE  9999 #define MAXLEAF     30 #define MAXNODE    MAXLEAF*2 -1 typedef struct  {     int bit[MAXBIT];     int start; } HCodeType;        /* 编码结构体 */ typedef struct {  

Huffman树的应用 (数据结构)

Huffman树的应用: 1.先选择一篇文章 2.然后统计字符个数 3.对个数不为0字符的进行编码 4.输出码文 5.进行译码 上机代码: /************************************************************************* > File Name: Huffman树的应用.cpp > Author: zzuspy > Mail: [email protected] > Created Time: 2014年12月3日

数据结构复习之利用Huffman树进行编码和译码

//编码#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<queue> #include<fstream> #include<map> using namespace std; typedef struct HuffmanNode{ int w;//节点的权值

数据结构C++使用最小堆实现huffman树

#pragma once #include"Heap.h"//使用博客实现的堆 template<class T> struct HuffmanNode//节点的结构信息 { T _weight; HuffmanNode<T>* _parent; HuffmanNode<T>* _left; HuffmanNode<T>* _right; HuffmanNode(const T& weight) :_weight(weight)

哈夫曼 (Huffman) 树的动画演示

 哈夫曼 (Huffman) 树的动画演示: http://people.cs.pitt.edu/~kirk/cs1501/animations/Huffman.html 此网站中亦有诸多其它算法的动画演示,可供学习算法或是数据结构相关内容时参考.

javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题

赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支构成这两个结点之间的路径. ② 路径长度:结点路径上的分支数目称为路径长度. ③ 树的路径长度:从树根到每一个结点的路径长度之和. 以下图为例: A到F :结点路径 AEF : 路径长度(即边的数目) 2 : 树的路径长度:3*1+5*2+2*3=19: ④ 结点的带权路径长度:从该结点的到树的根结

HUFFMAN 树

在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN) 树和哈夫曼编码.哈夫曼编码是哈夫曼树的一个应用.哈夫曼编码应用广泛,如 JPEG中就应用了哈夫曼编码. 首先介绍什么是哈夫曼树.哈夫曼树又称最优二叉树, 是一种带权路径长度最短的二叉树.所谓树的带权路径长度,就是树中所有的叶结点 的权值乘上其到根结点的 路径长度(若根结点为0层,叶结点到根结点的路径长度 为叶结点的层数).树的带权路径长度记为WPL= (W1*L1+W2*L2+W3*L3+...+Wn*Ln) ,