#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct HuffmanTree
{
int weight;
int parent, lchild, rchild;
}HuffmanTree;
typedef struct CodeNode
{
int ch;
char bits[4+1];
}CodeNode;
void SelectMin(HuffmanTree tree[], int len, int * pos1, int* pos2)
{
int min=255;
int i, j;
*pos1=0;
*pos2=0;
for(i=0; i<len; i++)
{
if(tree[i].parent==-1)
if(min>tree[i].weight)
{
min=tree[i].weight;
*pos1=i;
}
}
min=255;
for(j=0; j<len; j++)
{
if(j==*pos1)
continue;
if(tree[j].parent==-1)
if(min>tree[j].weight)
{
min=tree[j].weight;
*pos2=j;
}
}
}
void CreateHuffmanTree(HuffmanTree tree[], int n)
{
int m=2*n;
int i;
for(i=n; i<m-1; i++)
{
int pos1, pos2;
HuffmanTree node;
SelectMin(tree, i, &pos1, &pos2);
printf("pos1=%d,pos2=%d\n", pos1, pos2);
node.weight=tree[pos1].weight+tree[pos2].weight;
tree[pos1].parent=i;
tree[pos2].parent=i;
node.lchild=pos1;
node.rchild=pos2;
node.parent=-1;
tree[i]=node;
}
}
void HuffmanEncoding(HuffmanTree tree[])
{
int c, p, i;
int start;
char cd[4+1];
cd[4]='\0';
for(i=0; i<4; i++)
{
printf("\n");
printf("%d",tree[i].weight);
printf(":");
start=4;
c=i;
while((p=tree[c].parent)!=-1)
{
if(tree[p].lchild==c)
{
cd[--start]='0';
}
else
{
cd[--start]='1';
}
c=p;
}
printf(&cd[start]);
}
}
int main(int argc, char* argv[])
{
HuffmanTree tree[4*2];
int i, j;
for(i=0; i<4; i++)
{
tree[i].lchild=-1;
tree[i].rchild=-1;
tree[i].parent=-1;
}
printf("请输入哈夫曼树叶子结点的权值: \n");
for(i=0; i<4; i++) //读入叶子结点的权值
{
int weight;
scanf("%d",&weight);
tree[i].weight=weight;
}
CreateHuffmanTree(tree, 4);
for(j=0; j<2*4-1; j++)
{
printf("tree[%d]:weight=%d \n", j, tree[j].weight);
}
HuffmanEncoding(tree);
return 0;
}

  

Huffman Tree -- Huffman编码的更多相关文章

  1. Huffman coding & Huffman tree

    Huffman coding & Huffman tree Huffman coding 哈夫曼编码 / 最优二元前缀码 Huffman tree 哈夫曼树 / 最优二叉树 https://w ...

  2. 赫夫曼\哈夫曼\霍夫曼编码 (Huffman Tree)

    哈夫曼树 给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离 ...

  3. 哈夫曼树(Huffman Tree)与哈夫曼编码

    哈夫曼树(Huffman Tree)与哈夫曼编码(Huffman coding)

  4. Huffman Tree

    哈夫曼(Huffman)树又称最优二叉树.它是一种带权路径长度最短的树,应用非常广泛. 关于Huffman Tree会涉及到下面的一些概念: 1. 路径和路径长度路径是指在树中从一个结点到另一个结点所 ...

  5. 数据结构实习 problem O Huffman Tree

    Huffman Tree 题目描述 对输入的英文大写字母进行统计概率 然后构建哈夫曼树,输出是按照概率降序排序输出Huffman编码. 输入 大写字母个数 n 第一个字母 第二个字母 第三个字母 .. ...

  6. 用优先队列构造Huffman Tree及判断是否为最优编码的应用

    前言 我们知道,要构造Huffman Tree,每次都要从堆中弹出最小的两个权重的节点,然后把这两个权重的值相加存放到新的节点中,同时让这两个节点分别成为新节点的左右儿子,再把新节点插入到堆中.假设节 ...

  7. Huffman树进行编码和译码

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

  8. Huffman树的编码译码

    上个学期做的课程设计,关于Huffman树的编码译码. 要求: 输入Huffman树各个叶结点的字符和权值,建立Huffman树并执行编码操作 输入一行仅由01组成的电文字符串,根据建立的Huffma ...

  9. 51nod1117(简单huffman tree)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1117 题意:中文题诶- 思路:简单huffman tree ...

随机推荐

  1. poj 2378 删点最大分支不超过一半

    http://poj.org/problem?id=2378 这题和找重心基本一样,判断条件换一下就行 #include <iostream> #include <string> ...

  2. 微信小程序入门开发文档

    第一步:下载微信小程序开发者工具并安装,下载路径: https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html 进到下载界面后,根 ...

  3. 移动web基础

    接触retina屏 基础知识(移动Web的基础知识)排版布局(高效的移动Web布局)开发效率终端交互优化 pixel像素基础viewport视图viewport_meta标签viewport_codi ...

  4. Linux 下, 安装Android Studio

    Download the Android Package of Linux from Android Studio, android-studio-bundle-130.737825-linux.tg ...

  5. Android 应用监听自身卸载,弹出用户反馈调查

    监听卸载情景和原理分析 1,情景分析 在上上篇博客中我写了一下NDK开发实践项目,使用开源的LAME库转码MP3,作为前面几篇基础博客的加深理解使用的,但是这样的项目用处不大,除了练练NDK功底.这篇 ...

  6. (转)两张Firefox OS 系统截图

    锁屏图 锁屏就是一个向上的小火箭. 桌面 桌面又是另一种风格. 注意 以上为Android系统下运行b2g. 原文地址,TZone

  7. Zamplus 晶赞天机

    类型: 定制服务 软件包: car/vehicle integrated industry solution collateral tourism 联系服务商 产品详情 解决方案 概要 DMP:通常称 ...

  8. js中字符串怎么转化为日期

    var str = "2010-08-01"; // 转换日期格式 str = str.replace(/-/g, '/'); // "2010/08/01"; ...

  9. 找父节点和子节点个数(Poj1634)

    题目链接:http://poj.org/problem?id=1634 思路:按照工资从小到大排好,找到最近的那个身高较高的人. 有一点要注意的是,这里有个根节点,大boss,他的id是0,因此,我这 ...

  10. react里面怎么引入样式

    模块样式 在刚开始构建好框架的时候,准备开始写业务,在第一个页面的时候就会碰到怎么引入样式的问题,踩过一些坑,不是使用style,头部也不需要另外取名,直接引入css就可以,引入方式是这样 <d ...