哈夫曼树--链式结构(建立huffman树、编码、解码)
package tree; import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Map.Entry;import java.util.Set;import java.util.Stack; /** * 哈夫曼编码解码 * @author LiangYH * */public class HuffmanTest { public static void main(String[] args) { HuffmanTest tree1 = new HuffmanTest(); tree1.setRoot("A", 9); HuffmanTest tree2 = new HuffmanTest(); tree2.setRoot("B", 5); HuffmanTest tree3 = new HuffmanTest(); tree3.setRoot("C", 8); HuffmanTest tree4 = new HuffmanTest(); tree4.setRoot("E", 19); HuffmanTest tree7 = new HuffmanTest(); tree7.setRoot("F", 11); MyLink link = new MyLink(); link.add(tree1); link.add(tree2); link.add(tree3); link.add(tree7); link.add(tree4); link.printLink(); HuffmanTest t1 = null; HuffmanTest t2 = null; while(link.size() > 1){ t1 = link.delete(); t2 = link.delete(); t2.growTree(t1); link.add(t2); } t2.printTree(); Map<String,List<String>> map = t2.getCodeTable(); t2.printCodeTable(map); List<String> list = t2.encode("AEBCF"); List<String> li2 = t2.decode(list); System.out.println(); System.out.print("解码: "); for(String s: li2){ System.out.print(s); } } private List<Node> leaves = null; private Map<String, List<String>> codeMap= null; private Node root = null; public HuffmanTest(){ leaves = new ArrayList<Node>(); codeMap = new HashMap<String, List<String>>(); } public Map<String,List<String>> getCodeMap(){ return this.codeMap; } public List<Node> getLeaves(){ getLeaves(root); return this.leaves; } public void setRoot(String item, int rate){ this.root = new Node(item, rate); } public Node getRoot(){ return this.root; } public int getRateOfRoot(){ return this.root.rate; } public void growTree(HuffmanTest newTree){ Node newNode = new Node(); //设置子节点 newNode.leftChild = this.root; newNode.rightChild = newTree.getRoot(); //设置父节点 this.root.parent = newNode; newTree.getRoot().parent = newNode; //设置父节点的权重 newNode.setRate(this.root.rate+newTree.getRateOfRoot()); //重置根节点 this.root = newNode; } public void InOrderTraverse(HuffmanTest tree){ traverse(tree.root); } private void traverse(Node node){ if(node != null){ System.out.print(node.item+"/"+node.rate+"; "); traverse(node.leftChild); traverse(node.rightChild); } } //获取叶子节点 private void getLeaves(Node node){ if(node != null){ if(node.item != null){ leaves.add(node); } getLeaves(node.leftChild); getLeaves(node.rightChild); } } public Map<String,List<String>> getCodeTable(){ //获取叶子节点 getLeaves(root); int len = leaves.size(); for(int i = 0; i < len; i++){ Node tempNode = leaves.get(i); List<String> tempList = new ArrayList<String>(); codeMap.put(tempNode.item, tempList); while(tempNode.parent != null){ if(tempNode == tempNode.parent.leftChild){ tempList.add("0"); }else if(tempNode == tempNode.parent.rightChild){ tempList.add("1"); } tempNode = tempNode.parent; } } return this.codeMap; } public List<String> encode(String target){ System.out.println(); System.out.print(target+" 的编码: "); List<String> li = new ArrayList<String>(); int len = target.length(); for(int i = 0; i < len; i++){ String temp = String.valueOf(target.charAt(i)); List<String> list = codeMap.get(temp); for(int k = list.size()-1; k >= 0; k--){ System.out.print(list.get(k)); li.add(list.get(k)); } } return li; } /** * 解码 * @param codeList 二进制编码 * @return 解码结果 */ public List<String> decode(List<String> codeList){ List<String> list = new ArrayList<String>(); Node tempNode = null; tempNode = root; for(String s: codeList){ if("0".equals(s)){ tempNode = tempNode.leftChild; if(tempNode.item != null){ list.add(tempNode.item); tempNode = root; continue; } }else if("1".equals(s)){ tempNode = tempNode.rightChild; if(tempNode.item != null){ list.add(tempNode.item); tempNode = root; continue; } } } return list; } public void printTree(){ InOrderTraverse(this); } public void printCodeTable(Map<String,List<String>> codeTable){ Set<Entry<String,List<String>>> set = codeTable.entrySet(); Iterator<Entry<String,List<String>>> iter = set.iterator(); System.out.println(); while(iter.hasNext()){ Entry<String,List<String>> entry = iter.next(); System.out.print(entry.getKey()+": "); List<String> li = entry.getValue(); for(int i = li.size()-1; i >= 0; i--){ System.out.print(li.get(i)); } System.out.print("; "); } } class Node{ Node leftChild = null; Node rightChild = null; Node parent = null; //字母 String item = null; //字母出现的频率 int rate = 0; public Node(){ } public Node(String item, int rate){ this.item = item; this.rate = rate; } public void setItem(String item){ this.item = item; } public void setRate(int rate){ this.rate = rate; } public void printNode(){ System.out.println(item+"\\"+rate+"; "); } }} /** * 优先链表 * @author LiangYH * */class MyLink{ private LinkNode first = null; private int size = 0; public MyLink(){ } /** * 增加节点,并按照相关顺序从小到大排列 * @param tree */ public void add(HuffmanTest tree){ LinkNode newNode = new LinkNode(tree); if(first == null){ first = newNode; size++; }else{ boolean isNextNull = false; LinkNode previous = first; LinkNode temp = first; while(tree.getRateOfRoot() > temp.tree.getRateOfRoot()){ if(temp.next == null){ isNextNull = true; break; } previous = temp; temp = temp.next; } //temp所指的是最后一个 if(isNextNull){ temp.next = newNode; size++; return; } //如果temp指向的是第一个 if(temp == first){ newNode.next = first; first = newNode; size++; }else{ newNode.next = temp; previous.next = newNode; size++; } } } /** * 删除最左边的一个元素 * @return */ public HuffmanTest delete(){ if(isEmpty()) return null; LinkNode temp = first; first = first.next; size--; return temp.tree; } public boolean isEmpty(){ return first == null; } public int size(){ return this.size; } public void printLink(){ LinkNode temp = first; while(temp.next != null){ System.out.print(temp.tree.getRoot().item+"\\"+temp.tree.getRateOfRoot()+"; "); temp = temp.next; } System.out.println(temp.tree.getRoot().item+"\\"+temp.tree.getRateOfRoot()); } /** * 内部类 * @author LiangYH * */ class LinkNode{ LinkNode next = null; HuffmanTest tree; public LinkNode(HuffmanTest tree){ this.tree = tree; } } }
哈夫曼树--链式结构(建立huffman树、编码、解码)相关推荐
- 【C】二叉树--顺序结构(详解堆的实现,topK排序、堆排)、和链式结构(链式结构的遍历、链式结构常见递归操作以及练习题)
本章我们将引入树的概念并详细介绍二叉树.我们会在介绍顺序二叉树基础上,进一步介绍堆以及堆的实现,并以此为依据详解topK排序.堆排等问题:然后我们会介绍链式二叉树的实现以及各种操作.最后,我们也会给出 ...
- 二叉树的链式结构的非递归遍历
二叉树的链式结构的非递归遍历 一. 非递归前序遍历和非递归中序遍历 1. Stack.h #ifndef__STACK_H__ #define__STACK_H__ #include<st ...
- 二叉树的链式结构递归遍历实现
二叉树的链式结构递归遍历实现 1. BinTree.h文件 #ifndef__BINTREE_H__ #define__BINTREE_H__ #include<stdio.h> ...
- 区块链 - 牵一发而动全身的链式结构
文章目录 前言 区块的结构 区块如何链接的 反向链接 分叉 如果区块中交易被篡改后 结束语 前言 我们已经深度剖析了工作量证明和梅克尔树这两个典型的哈希应用,这次我们讨论哈希的第三个应用,也是数字货币 ...
- 电话号码查询系统(链式结构)
摘要:C/C++ 数据结构 正文:用链式结构来实现电话号码查询系统,程序如下: #include<iostream> #include<malloc.h> #include& ...
- C/C++实现栈的链式结构(链栈)
今天我们学习的是链栈,也就是说栈的链式结构,我们运用顺序链的方式来实现.首先呢,链栈是不存在存储空间满的情况的,所以可以说它是个无底洞,然而我们之前学的顺序栈是有额定空间的. 栈顶指针总是指向栈顶前面 ...
- 数据结构(顺序结构、链式结构、索引结构、散列结构)
文章目录 1.概述 2.数据间逻辑关系 3.数据的存储结构(或物理结构) 3.1顺序结构 3.2链式结构 3.3索引结构 3.4散列结构 4.运算结构 1.概述 数据结构,就是一种程序设计优化的方法论 ...
- 二叉树链式结构的实现
目录 1.二叉树链式结构的实现 1.1前置说明 1.2二叉树的遍历 1.2.1前序.中序以及后序遍历 1.2.2层序遍历 1.3二叉树节点个数及高度等 1.4二叉树的创建和销毁 1.5完全二叉树的判断 ...
- 栈之顺序结构和链式结构
栈的顺序结构实现 typedef int Position; struct SNode {ElementType *Data; /* 存储元素的数组 */Position Top; /* 栈顶指针 * ...
最新文章
- typescript用什么软件写_为什么都2019年了大家还喜欢用TypeScript?
- linux里查看最耗CPU的线程
- asp.net 得到上一页地址
- most recent call last 报错_视频|救援情景剧、创意快闪……400w+人次为重庆这场消防宣传活动打call...
- 用Visual C#实现文件下载
- 谷歌要求华为不启用鸿蒙,谷歌:华为我不让你用我的服务!华为:我还是照样用!...
- c++指定在某一线程运行_iPhone11升级iOS14运行速度测试:结果有点小惊喜
- 十八、泛型 l 注解 l Servlet3.0 l 动态代理 l 类加载器基础加强
- 若泽数据 巨人_面部识别巨人拒绝分享有关其算法数据集的详细信息
- sqoop的job工具
- HG255D刷机及网络接口配置
- delphi 读取pdf
- 联想g500网卡linux驱动,联想g500无线网卡驱动下载-lenovog500无线网卡驱动v10.0.0.225 官方版 - 极光下载站...
- 【读书笔记】淘宝技术这十年
- Stack (算法入门4)
- Android 开发常用性能优化工具总结
- 关于printf(%d,%d,i--,i++)的问题
- 去中心化的区块链如何理解?
- 88是python的整数类型吗_python基本数据类型
- 如何减少页面的重绘和回流(14)
热门文章
- logstsh xpack 认证_ElasticSearch Kibana 和Logstash 安装x-pack记录
- UVA11732 strcmp() Anyone?
- python精简笔记(五)——函数式编程
- Ubuntu 新装服务器部署流程
- 不仅仅是写代码,而是完成作品
- android 多屏幕适配 : 第一部分
- STL——内存基本处理工具
- Windows下Hadoop的环境安装[转]
- C语言 输入中文语句并按倒叙将它输出
- 哈工大中文信息处理_【NLP】哈工大车万翔教授 自然语言处理NLPer的核心竞争力是什么?19页ppt...