#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. mysql数据库忘记密码时如何修改(一)

    方法/步骤 打开mysql.exe和mysqld.exe所在的文件夹,复制路径地址 打开cmd命令提示符,进入上一步mysql.exe所在的文件夹. 输入命令  mysqld --skip-grant ...

  2. 《C#高效编程》读书笔记09-避免在API中使用转换操作符

    转换操作符为类之间引入了一种"可替换性"(substitutability)."可替换性"表示一个类的实例可以替换为另一个类的实例. public class ...

  3. D2 前端会议

    D2 前端会议 时间 2019年1月6日 图片

  4. C 碎片十一 扫雷源码

    // C语言版本扫雷 #include <stdio.h> #include <stdlib.h> /* 1(0,0) 1(0,1) 0(0,2) 1(0,3) 1(0,4) ...

  5. linux下的tomcat开机自启动(亲测),更改静态ip

    开机自启动Tomcat: 1.修改脚本文件rc.local:vim /etc/rc.d/rc.local 这个脚本是使用者自定的开机启动程序,可以在里面添加想在系统启动之后执行的脚本或者脚本执行命令 ...

  6. Struts2初级篇(HelloWorld)

    Struts2的工作流程: 从一个高水平角度看,Struts2 是一个MVC拉动的(或MVC2)框架,Struts2 的模型-视图-控制器模式是通过以下五个核心部分进行实现的: 操作(Actions) ...

  7. $.ajax防止多次点击重复提交的方法

    第一种:使用$.ajaxPrefilter( [dataTypes], handler(options, originalOptions, jqXHR) ) 方法:$.ajaxPrefilter()方 ...

  8. koa源码分析

    最近项目要使用koa,所以提前学习一下,顺便看了koa框架的源码. 注:源码是koa2.x koa的源码很简洁,关键代码只有4个文件,当然还包括一些依赖npm包 const Koa = require ...

  9. [转]latex输入数学符号速查

    基本运算 乘法 x×y x \times y 乘方 23x 2^{3x} 平方根 x+y−−−−−√ \sqrt {x + y} 除法 x÷y x \div y 分数 xy \frac{x}{y} 异 ...

  10. Spring Boot相关组件的添加

    在勾选相关组件后, pom.xml文件上发生了根本的变化 1.这是最简单的项目的pom文件 <?xml version="1.0" encoding="UTF-8& ...