上个学期做的课程设计,关于Huffman树的编码译码。

要求:

输入Huffman树各个叶结点的字符和权值,建立Huffman树并执行编码操作

输入一行仅由01组成的电文字符串,根据建立的Huffman树进行译码操作,程序最后输出译码后的结果

Huffman.h定义了树的结点信息,各种操作。GCC编译通过。

 #ifndef HUFFMAN_H_INCLUDED
#define HUFFMAN_H_INCLUDED
#include <iostream>
#include <stdlib.h>
#include <string> #define leafNumber 20
#define totalNumber 39
#define maxValue 100
using namespace std; //权值类型, 这里定义为int
typedef int WType; //树的结点类型, 这里定义为char, 表示字符
typedef char TElemType; //Huffman树结点信息定义
typedef struct HuffmanNode{
TElemType data;
WType weight;
int left_child;
int right_child;
int parent;
string code; //每个结点的编码, 定义为 string 类
}; //Huffman树结构定义
typedef struct HuffmanTree{
HuffmanNode elem[totalNumber];
int currentNumber;
}; /*
*构建Huffman树
*/
void createHuffmanTree( HuffmanTree &HT, WType w[], int n ) {
int i, j, p1, p2, min1, min2;
for( i = ; i < n; i++ ) HT.elem[i].weight = w[i];
for( i = ; i < * n - ; i++ )
HT.elem[i].parent = HT.elem[i].left_child = HT.elem[i].right_child = -;
for( i = n; i < * n - ; i++ ) {
min1 = min2 = maxValue;
for( j = ; j < i; j++ ) {
if( HT.elem[j].parent == - )
if( HT.elem[j].weight < min1 ) {
p2 = p1;
min2 = min1;
p1 = j;
min1 = HT.elem[j].weight;
}
else if( HT.elem[j].weight < min2 ) {
p2 = j;
min2 = HT.elem[j].weight;
}
}
HT.elem[i].left_child = p1;
HT.elem[i].right_child = p2;
HT.elem[i].weight = HT.elem[p1].weight + HT.elem[p2].weight;
HT.elem[p1].parent = HT.elem[p2].parent = i;
}
HT.currentNumber = * n - ;
} /*
*对Huffman树每个结点进行编码
*/
void Coding( HuffmanTree &HT, int n ) { //当前节点下标
int current = ;
//父节点下标
int parent = ;
for( int i = * n - ; i >= ; i-- ) { current = i;
parent = HT.elem[current].parent;
/*
if( parent == -1 ) HT.elem[current].code[0] = '0';
else {
if( HT.elem[parent].left_child == current ) {
strcat( HT.elem[current].code, HT.elem[parent].code );
strcat( HT.elem[current].code, "0" );
}
if( HT.elem[parent].right_child == current ) {
strcat( HT.elem[current].code, HT.elem[parent].code );
strcat( HT.elem[current].code, "1" );
}
}
*/ while (parent != -)
{
if (HT.elem[parent].left_child == current) HT.elem[i].code += "";
else HT.elem[i].code += ""; current = parent;
parent = HT.elem[current].parent;
} //HT.elem[current].code += "0";
reverse( HT.elem[i].code.begin(), HT.elem[i].code.end() ); } } /*
*译码
*/
void decode( HuffmanTree &HT, int n ) {
cout << "输入电文: ";
char ch[];
gets( ch ); int i = ;
int parent;
int root = * n - ;
int index = root;
int count = ;
int len = strlen( ch );
while( ch[i] != '#' ) {
if( ch[i] == '' ) {
index = HT.elem[index].left_child;
//cout << "经过0" << endl;
//cout << index << endl;
//count++;
}
else if( ch[i] == '' ) {
index = HT.elem[index].right_child;
//cout << "经过1" << endl;
//cout << index << endl;
//count++;
}
if( HT.elem[index].left_child == - && HT.elem[index].right_child == - ) {
cout << HT.elem[index].data;
index = root;
//i += count;
//count = 0;
//cout << index << endl;
}
i++;
}
}
/*
*遍历
*/
void PreOrder( HuffmanTree &HT, int n ) {
for( int i = ; i < n; i++ ) {
cout << "字符: " << HT.elem[i].data << ", " << "权值: " << HT.elem[i].weight << " Huffman编码: " << HT.elem[i].code << endl;
}
}; #endif // HUFFMAN_H_INCLUDED
#include "Huffman.h"
int main() {
HuffmanTree HT;
HT.elem[].data = 'A';
HT.elem[].data = 'B';
HT.elem[].data = 'C';
HT.elem[].data = 'D';
HT.elem[].data = 'E';
WType weight[] = { , , , , };
//WType weight[] = { 5,7,2,13 };
createHuffmanTree( HT, weight, );
Coding( HT, );
PreOrder( HT, ); cout << endl << endl;
for( int i = ; i < ; i++ )
cout << "Node " << i << " Code: " << HT.elem[i].code << endl; cout << endl << endl;
for( int i = ; i < ; i++ ) {
cout << "Node " << i << ": " << "weight = " << HT.elem[i].weight << ", parent = " << HT.elem[i].parent << ", left_child = " << HT.elem[i].left_child
<< ", right_child = " << HT.elem[i].right_child << endl;
}
decode( HT, );
return ;
}

运行截图:

Huffman树的编码译码的更多相关文章

  1. Huffman树与编码

    带权路径最小的二叉树称为最优二叉树或Huffman(哈夫曼树). Huffman树的构造 将节点的权值存入数组中,由数组开始构造Huffman树.初始化指针数组,指针指向含有权值的孤立节点. b = ...

  2. Huffman树与编码的简单实现

    好久没写代码了,这个是一个朋友问的要C实现,由于不会C,就用JAVA写了个简单的.注释掉的代码属性按照原来朋友发的题里带的参数,发现没什么用就给注释掉了. package other; import ...

  3. Huffman树进行编码和译码

    //编码#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> ...

  4. Huffman树及其编码(STL array实现)

    这篇随笔主要是Huffman编码,构建哈夫曼树有各种各样的实现方法,如优先队列,数组构成的树等,但本质都是堆. 这里我用数组来存储数据,以堆的思想来构建一个哈弗曼树,并存入vector中,进而实现哈夫 ...

  5. Huffman树及其编解码

    Huffman树--编解码 介绍:   Huffman树可以根据输入的字符串中某个字符出现的次数来给某个字符设定一个权值,然后可以根据权值的大小给一个给定的字符串编码,或者对一串编码进行解码,可以用于 ...

  6. 构造数列Huffman树总耗费_蓝桥杯

    快排! /** 问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的 ...

  7. Java蓝桥杯练习题——Huffman树

    Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Huffman树的过程如下: 找到{pi}中 ...

  8. Huffman树的构造及编码与译码的实现

    哈夫曼树介绍 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树.所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数) ...

  9. Huffman编码(Huffman树)

    [0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 "Huffman编码(Huffman树)" 的idea 并用源代码加以实现: 0.2) ...

随机推荐

  1. Android popupwindow 弹出的位置问题

    在Android开发中,需要用到PopupWindow这个类.在初始化完成,显示之前,都需要获得这个对象的width,height去计算popupWindow弹出的位置. 这个时候会发现取得的widt ...

  2. QQ音乐无损歌曲接口api

    1.打开QQ音乐官网 y.qq.com 2.选择你要的歌曲,进入后查看网址,以虎口脱险这个歌曲为例:http://y.qq.com/#type=song&mid=000Ib8E71sUNi7 ...

  3. Android开发-API指南- Calendar Provider

    Calendar Provider 英文原文:http://developer.android.com/guide/topics/providers/calendar-provider.html 采集 ...

  4. 压缩上传并预览 flash

    最近研究一个功能:用as3写的上传图片并实现预览.觉得花了很多时间也学到很多知识,将自己的所得记录下来供大家分享. 首先是预览功能的实现,大家自然而然就想到了loader来加载图片并显示,由于项目没有 ...

  5. 华为OJ平台——统计字符串中的大写字母

    题目描述: 统计字符串中的大写字母的个数 输入: 一行字符串 输出: 字符串中大写字母的个数(当空串时输出0) 思路: 这一题很简单,直接判断字符串中的每一个字符即可,唯一要注意的一点是输入的字符串可 ...

  6. noip2009提高组题解

    NOIP2009题解 T1:潜伏者 题目大意:给出一段密文和破译后的明文,一个字母对应一个密文字母,要求破译一段密文,如果有矛盾或有未出现密文无法破译输出failed,否则输出明文. 思路:纯模拟题 ...

  7. PAT1015. Reversible Primes

    //题的理解是n在基数b中的的表示中,正序和逆序值都是素数,但是其实可直接判断n,因为n在b中的正常序列值就是再换成十进制就是n,但是不A:不知道为什么 用笨方法,先把n展开成b进制,正常计算其实是翻 ...

  8. 在PHP5.3以上版本运行ecshop和ecmall出现的问题及解决方案

    ecshop 问题一:商城首页报错 Strict Standards: Only variables should be passed by reference in D:\wamp\ecshop\i ...

  9. 获取本地IP地址信息

    2012-06-05    /// <summary>         /// 获取本地IP地址信息         /// </summary>         void G ...

  10. SQL表自连接用法

      一个表与自身进行连接,称为自连接 问题的提出:一个网友提出这样一个SQL题目,说自己想了很久没解决,我一看,这不是很简单吗 可是自己在查询分析器调试了半天原来问题并不是那不简单 有一个学生表,里面 ...