前言:最近项目上一直没事干,感觉无聊到了极点,给自己找点事做,补一下大学没有完成的事情,写一个huffman算法Java版的,学校里面写过c语言的。

因为很久没搞数据结构和算法这方面了(现在搞Java web,真心感觉没什么挑战啊),代码写的一般,边听歌边写,3小时,不知道为什么现在效率这么低,写习惯了

xml配置,感觉纯写算法代码手生的紧,悲呼唉哉!

1、哈夫曼树:

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

2、生成过程:

1. 在n个权值里面首先寻找最小的两个权值作为子节点,开始生成第一棵子树;

2.将新子树的父节点作为一个新的权值与剩余的权值继续做比较,选出最小的两个权值继续构造新子树;

3.依次进行,直到最后一棵子树生成;

4.这时候,最后一棵子树的根节点就是整个哈夫曼树的根节点,从此根节点开始遍历,就能遍历完整个哈夫曼树。

3、图形表示:

假设有6个权值:1、2、3、4、5、6,生成哈夫曼树的过程如下:

依次下去...

这样,最终得到的父节点21就是哈夫曼树的根节点,遍历树的话,

c/c++就是:root->left  root->right就可以通过递归的方式从root节点访问到最后一个子节点。

Java就是:   root.left   root.right通过递归从root访问到最后一个子节点。

当然,二叉树的遍历不止递归一种方法,递归是最有效率的一种,还可以通过数据结构里面堆/栈的方式进行遍历。

下面是我写的实现哈夫曼树的Java代码(为了完成功能,绝壁不是优秀的,但可以方便看懂)

注:储存权值使用了List列表,随时增或者删方便一点。

  1 import java.util.ArrayList;
  2 import java.util.List;
  3
  4 class Node
  5 {
  6     int weight;
  7     Node left,right,parent;
  8     public Node(int weight)
  9     {
 10         this.weight=weight;
 11     }
 12 }
 13 public class Huffman {
 14     private static List<Node> list=new ArrayList<Node>();
 15     public  static Node root;
 16     public void insert(Node node)
 17     {
 18         //按照插入排序的方式将节点有序插入list
 19         if(list.size()==0){
 20             list.add(node);
 21             return;
 22         }
 23         int size=list.size();
 24         for(int i=0;i<size;)
 25         {
 26             if(list.get(i).weight<node.weight){
 27                 i++;
 28                 if(i>=list.size())
 29                     list.add(node);
 30             }
 31             else
 32             {
 33                 //交换位置
 34                 list.add(list.get(list.size()-1));
 35                 for(int j=list.size()-1;j>i;j--)
 36                 {
 37                     list.set(j, list.get(j-1));
 38                 }
 39                 list.set(i, node);//插入新数据
 40                 return;
 41             }
 42
 43         }
 44
 45     }
 46     public Node createTree(Node n1,Node n2)
 47     {
 48         //返回新子树的父节点
 49         Node parentNode=new Node(0);
 50         parentNode.weight=n1.weight+n2.weight;
 51         parentNode.left=n1;
 52         parentNode.right=n2;
 53         n1.parent=parentNode;
 54         n2.parent=parentNode;
 55         return parentNode;
 56     }
 57     public void run(List<Node> list)
 58     {
 59         int length=list.size();
 60         while(length!=0)
 61         {
 62             if(length==1){
 63                 root=list.get(0);
 64                 return;
 65             }
 66             if(length==2){
 67                 root=createTree(list.get(0),list.get(1));
 68                 return;
 69             }
 70             Node n1=list.get(0);
 71             Node n2=list.get(1);
 72             Node newNode=createTree(n1,n2);
 73             for(int i=0;i<length-2;i++)
 74             {
 75                 //转移数据
 76                 list.set(i, list.get(i+2));
 77             }
 78             list.remove(length-1);
 79             list.remove(length-2);
 80             insert(newNode);
 81             length=list.size();
 82         }
 83
 84     }
 85     public void display(Node node)
 86     {
 87         if(node!=null)
 88         {
 89             display(node.left);
 90             System.out.print(node.weight+"\t");
 91             display(node.right);
 92         }
 93     }
 94     public void drawTree(Node node)
 95     {
 96         if(node!=null)
 97         {
 98             //中序遍历,打算打印树形状,有些麻烦,后面改进
 99 //            if(node.parent!=null&&node.parent.left==node)
100 //                System.out.print("/");
101 //            if(node.parent!=null&&node.parent.right==node)
102 //                System.out.print("\\");
103             System.out.print(node.weight+"\t");
104             drawTree(node.left);
105             drawTree(node.right);
106         }
107     }
108     public static void main(String[] args)
109     {
110         Huffman hf=new Huffman();
111         hf.insert(new Node(1));
112         hf.insert(new Node(2));
113         hf.insert(new Node(3));
114         hf.insert(new Node(4));
115         hf.insert(new Node(5));
116         hf.insert(new Node(6));
117         hf.run(list);
118         System.out.println("前序遍历");
119         hf.display(root);
120         System.out.println("\n中序遍历");
121         hf.drawTree(root);
122     }
123 }

执行结果:

后面,将写通过哈夫曼解析具体报文。

转载于:https://www.cnblogs.com/dftencent/p/4042545.html

闲来无事写写-Huffman树的生成过程相关推荐

  1. huffman树和huffman编码

    不知道为什么,我写的代码都是又臭又长. 直接上代码: #include <iostream> #include <cstdarg> using namespace std; c ...

  2. 数据结构源码笔记(C语言):Huffman树字符编码

    #include <stdio.h> #include<string.h> #define N 10 /*待编码字符的个数,即树中叶结点的最大个数*/ #define M 2* ...

  3. 数据结构实验三:Huffman树及Huffman编码的算法实现

    Exp03 Huffman树及Huffman编码的算法实现 Author: Maskros 实验目的 了解该树的应用实例,熟悉掌握Huffman树的构造方法及Huffman编码的应用, 了解Huffm ...

  4. 数据结构-Huffman树

    Huffman树的编码和解码 思想:1.统计字符串每个字母出现的个数2.依次取出两个最小的字母进行合并(分别作为左右子节点,另左子节点<右子节点的值),使用他们值之和作为根节点的值,并将根节点加 ...

  5. 深夜爆肝:万字长文3种语言实现Huffman树(强烈建议三连)

    文章目录 一.C语言能干大事 1. C语言下Huffman树的计算过程分析 2. C语言下Huffman树的编程 二.C#语言也不赖 1. C#下Huffman类的设计 2. C#中界面设计 3. 建 ...

  6. Huffman编码(Huffman树)

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

  7. Huffman树进行编码和译码

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

  8. huffman树_笃学不倦|c语言构造哈夫曼树哈夫曼编码

    艾薇巴蒂!许久不见甚是想念,想必这"涨姿势"的时刻大家已经期待许久了!今天我们要共同学习的是c语言构造哈夫曼树-哈夫曼编码 构造哈夫曼树 首先,我们需要了解哈夫曼树是什么: 相关知 ...

  9. Huffman树压缩和解压文件

    Huffman树 Huffman树:以静态三叉链的存储结构建立的二叉树 Huffman树是一个带权路径长度最小的二叉树,又称最优二叉树 Huffman树的构造方法 ①将每个结点都看作是一个树: ②选择 ...

最新文章

  1. 2022-2028年中国辉石行业市场全景调查及发展前景分析报告
  2. 鱼眼相机标定_鱼眼相机模型(二)
  3. arcgis for server 登陆manager失败解决办法
  4. python中国大学排名爬虫写明详细步骤-Python爬虫--2019大学排名数据抓取
  5. 子报表修改后需要重新导入,0.00显示.00的调整方法
  6. java二分查找递归_java学习之—递归实现二分查找法
  7. 一个长方体玻璃容器从里面量长宽_养观赏鱼用玻璃鱼缸吗?3种常见养鱼容器,另外2种养鱼效果不差...
  8. c++调用求平方根函数_如何使用java语言求一个正整数的平方根?(不使用库函数)...
  9. 为什么说微服务一定要有 API 网关?
  10. python免费全套教程-python入门免费教程看这些就够了
  11. MATLAB 学习资料整理
  12. 设置新版谷歌浏览器自动启用flash
  13. pr如何处理音效_pr怎么把视频声音去掉 去掉视频中的所有声音,视频消音操作...
  14. MATLAB:gca、gcf、gco区别
  15. 数据分析项目实战:电影数据分析
  16. Kali linux破解Wi-Fi
  17. pci配置基地址_PCI/PCIe基础——配置空间
  18. dashboard android,Dashboard软件下载
  19. intel英特尔NUC主机bug大清除案例
  20. 使用scrapy简单爬取网易新闻

热门文章

  1. C# 删除 文件 里面的第一行数据
  2. NameError: name ‘os‘ is not defined - 解决
  3. 使用vs2019和pyinstaller将py文件打包成一个exe文件(含图标),pyinstaller安装失败解决方案
  4. 2021牛客暑期多校训练营9,签到题HE
  5. Win10删除资源管理器左侧的Onedrive图标
  6. 【图论】最小生成树学习笔记
  7. 小学用计算机画画的课件,用计算机画图画.ppt
  8. 无法扩展该卷 因为群集的数量将超过文件系统_Ubifs文件系统分析
  9. spark的python开发安装方式,最简单的方式来安装Python依赖关系的Spark执行器节点?...
  10. OpenGL基础12:进入3D世界