#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;
}

数据结构-哈夫曼(Huffman)的更多相关文章

  1. 数据结构实训——哈夫曼(Huffman)编/译码器

    题目4.哈夫曼(Huffman)编/译码器(限1人完成) [问题描述] 利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本.但是,这要求在发送端通过一个编码系统对待传数据预先 ...

  2. [数据结构与算法]哈夫曼(Huffman)树与哈夫曼编码

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  3. 哈夫曼(Huffman)编码

    哈夫曼编码(Huffman Coding)是一种非常经典的编码方式,属于可变字长编码(VLC)的一种,通过构造带权路径长度最小的最优二叉树以达到数据压缩的目的.哈弗曼编码实现起来也非常简单,在实际的笔 ...

  4. 哈夫曼(Huffman)树+哈夫曼编码

    前天acm实验课,老师教了几种排序,抓的一套题上有一个哈夫曼树的题,正好之前离散数学也讲过哈夫曼树,这里我就结合课本,整理一篇关于哈夫曼树的博客. 主要摘自https://www.cnblogs.co ...

  5. 重温经典之赫夫曼(Huffman)编码

    先看看赫夫曼树假设有n个权值{w1,w2,…,wn},构造一个有n个叶子结点的二叉树,每个叶子结点权值为wi,则其中带权路径长度WPL最小的二叉树称作赫夫曼树或最优二叉树. 赫夫曼树的构造,赫夫曼最早 ...

  6. 数据结构-哈夫曼树(python实现)

    好,前面我们介绍了一般二叉树.完全二叉树.满二叉树,这篇文章呢,我们要介绍的是哈夫曼树. 哈夫曼树也叫最优二叉树,与哈夫曼树相关的概念还有哈夫曼编码,这两者其实是相同的.哈夫曼编码是哈夫曼在1952年 ...

  7. C#数据结构-赫夫曼树

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

  8. Java数据结构和算法(四)赫夫曼树

    Java数据结构和算法(四)赫夫曼树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 赫夫曼树又称为最优二叉树,赫夫曼树的一个 ...

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

    赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支 ...

随机推荐

  1. 网络编程——TCP协议

    1.TCP程序概述 TCP是一个可靠的协议,面向连接的协议. 实现TCP程序,需要编写服务器和客户端,Java API为我们提供了java.net包,为实现网络应用程序提供类. ServerSocke ...

  2. 用CSS控制图片大小显示的方法

    图片自动适应大小是一个非常常用的功能,在进行制作的时候为了防止图片撑开容器而对图片的尺寸进行必要的控制,我们可不可以用CSS控制图片使它自适应大小呢? 可以通过按比例缩小或者放大到某尺寸(自己指定), ...

  3. Docker | 第五章:构建自定义镜像

    前言 上一章节,主要是介绍了下Dockerfile的一些常用命令的说明.我们知道,利用Dockerfile可以构建一个新的镜像,比如运行Java环境,就需要一个JDK环境的镜像,但直接使用公共的镜像时 ...

  4. 14.JAVA-jar命令使用

    介绍 jar命令用来对*.class文件进行压缩,从而生成jar(archive)归档文件,避免文件过多. 定义一个文件: package common.demo ; public class Tes ...

  5. IO字节流。

    字节输出流: java.io.OutputStream :抽象类,是表示输出字节流的所有类的父类. java.io.FileOutputStream extends OutputStream: 文件字 ...

  6. hibernate课程 初探单表映射3-3 对象类型

    本节简介: 1 简介对象类型(重点是音视频blob类型) 2 demo(对图片的写入数据库与读取) 1 简介对象类型 映射类型 java类型 标准sql类型 mysql类型 oracle类型 bina ...

  7. 50道CSS基础面试题(附答案)

    1 介绍一下标准的CSS的盒子模型?与低版本IE的盒子模型有什么不同的? 标准盒子模型:宽度=内容的宽度(content)+ border + padding + margin低版本IE盒子模型:宽度 ...

  8. It's the loneliest feeling not to know who you are.

    It's the loneliest feeling not to know who you are.最孤独的感觉莫过于不知道自己是谁.

  9. mui的上拉下载和下拉刷新

    head部分(引入mui) <link href="./resources/css/mui.min.css" rel="stylesheet" /> ...

  10. jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})等的区别讲解

    1.(function($){...})(jQuery); (1).原理:       这实际上是匿名函数,如下: function(arg){...} 这就定义了一个匿名函数,参数为arg:而调用函 ...