Java 树结构实际应用 二(哈夫曼树和哈夫曼编码)
package huffmanTree; import java.util.ArrayList;
import java.util.Collections; public class HuffmanTree { public static void main(String[] args) {
int[] arr = {13, 7, 8, 3, 29, 6, 1}; Node createHuffmanTree = createHuffmanTree(arr); preOrder(createHuffmanTree); } // 前序遍历方法
public static void preOrder(Node root) {
if(root != null) {
root.preOrder();
} else {
System.out.println("空树!");
}
} // 创建哈夫曼树
public static Node createHuffmanTree(int[] arr) {
// 1 遍历arr数组
// 2 将arr的每个元素构成一个Node
// 3 将Node放入ArrayList
ArrayList<Node> nodes = new ArrayList<Node>();
for (int value: arr) {
nodes.add(new Node(value));
} while(nodes.size() > 1) {
Collections.sort(nodes); // System.out.println(nodes.toString()); // 取出根节点权值最小的两个二叉树
Node leftNode = nodes.get(0);
Node rightNode = nodes.get(1); // 构建新二叉树
Node parent = new Node(leftNode.value + rightNode.value);
parent.left = leftNode;
parent.right = rightNode;
// 删除处理过的节点
nodes.remove(leftNode);
nodes.remove(rightNode);
// parent加入List
nodes.add(parent); // Collections.sort(nodes);
// System.out.println(nodes.toString());
}
// 返回root
return nodes.get(0);
}
} // 创建节点
class Node implements Comparable<Node>{
int value;
Node left;
Node right; public void preOrder() {
System.out.println(this);
if(this.left != null) {
this.left.preOrder();
}
if(this.right != null) {
this.right.preOrder();
}
} public Node(int value) {
this.value = value;
} @Override
public String toString() {
return "Node [value= " + value + "]";
} @Override
public int compareTo(Node o) {
return this.value - o.value;
}
}



package com.lin.HuffmanCode_0314; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map; public class HuffmanCode { public static void main(String[] args) { String content = "i like like like java do you like a java";
byte[] contentBytes = content.getBytes();
System.out.println(contentBytes.length); // 40 List<Node> nodes = getNodes(contentBytes);
System.out.println(nodes); // 创建哈夫曼树
System.out.println("哈夫曼树");
Node createHuffmanTree = createHuffmanTree(nodes); preOrder(createHuffmanTree); } /**
*
* @Description:生成赫夫曼树对应的赫夫曼编码<br>
* 思路:将赫夫曼编码存放在Map<
* @author LinZM
* @date 2021-3-14 21:09:30
* @version V1.8
*/ // 前序遍历
private static void preOrder(Node root){
if(root != null) {
root.preOrder();
} else {
System.out.println("空树!");
}
}
/**
*
* @Description:
* @author LinZM
* @date 2021-3-14 20:45:23
* @version V1.8
* @param bytes接收字节数组
* @param
*/
private static List<Node> getNodes(byte[] bytes){
// 1 创建一个ArrayList
ArrayList<Node> nodes= new ArrayList<Node>(); // 遍历bytes,统计每一个byte出现的次数->map[key, value]
Map<Byte, Integer> counts = new HashMap();
for(byte b: bytes) {
Integer count = counts.get(b); //
if(count == null) { // Map中还没有这个字符数据, 第一次
counts.put(b, 1);
} else {
counts.put(b, count + 1);
}
}
// 把每个键值对转成一个Node对象, 并加入到nodes集合
for(Map.Entry<Byte, Integer> entry: counts.entrySet()) {
nodes.add(new Node(entry.getKey(), entry.getValue()));
}
return nodes;
} // 通过List创建赫夫曼树
private static Node createHuffmanTree(List<Node> nodes) {
while(nodes.size() > 1) {
Collections.sort(nodes); Node leftNode = nodes.get(0);
Node rightNode = nodes.get(1); Node parent = new Node(null, leftNode.weight + rightNode.weight); parent.left = leftNode;
parent.right = rightNode; nodes.remove(leftNode);
nodes.remove(rightNode); nodes.add(parent);
}
return nodes.get(0);
} } class Node implements Comparable<Node>{
Byte data;// 存放数据本身
int weight; // 权值,字符出现的次数
Node left;
Node right; public Node(Byte data, int weight) {
this.data = data;
this.weight = weight;
} @Override
public int compareTo(Node o) {
// TODO Auto-generated method stub
return this.weight - o.weight;
} @Override
public String toString() {
return "Node [data = " + data + " weight= " + weight + "]";
} // 前序遍历
public void preOrder() {
System.out.println(this);
if(this.left != null) {
this.left.preOrder();
}
if(this.right != null) {
this.right.preOrder();
}
}
}

仅供参考,有错误还请指出!
有什么想法,评论区留言,互相指教指教。
觉得不错的可以点一下右边的推荐哟
Java 树结构实际应用 二(哈夫曼树和哈夫曼编码)的更多相关文章
- Java数据结构(十二)—— 霍夫曼树及霍夫曼编码
霍夫曼树 基本介绍和创建 基本介绍 又称哈夫曼树,赫夫曼树 给定n个权值作为n个叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称为最优二叉树 霍夫曼树是带权路径长度最短的树,权值较 ...
- 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- java实现哈弗曼树和哈夫曼树压缩
本篇博文将介绍什么是哈夫曼树,并且如何在java语言中构建一棵哈夫曼树,怎么利用哈夫曼树实现对文件的压缩和解压.首先,先来了解下什么哈夫曼树. 一.哈夫曼树 哈夫曼树属于二叉树,即树的结点最多拥有2个 ...
- 10: java数据结构和算法: 构建哈夫曼树, 获取哈夫曼编码, 使用哈夫曼编码原理对文件压缩和解压
最终结果哈夫曼树,如图所示: 直接上代码: public class HuffmanCode { public static void main(String[] args) { //获取哈夫曼树并显 ...
- C语言数据结构之哈夫曼树及哈夫曼编码的实现
代码清单如下: #pragma once #include<stdio.h> #include"stdlib.h" #include <string.h> ...
- 04-树6. Huffman Codes--优先队列(堆)在哈夫曼树与哈夫曼编码上的应用
题目来源:http://www.patest.cn/contests/mooc-ds/04-%E6%A0%916 In 1953, David A. Huffman published his pap ...
- c++实现哈夫曼树,哈夫曼编码,哈夫曼解码(字符串去重,并统计频率)
#include <iostream> #include <iomanip> #include <string> #include <cstdlib> ...
- Java 树结构实际应用 四(平衡二叉树/AVL树)
平衡二叉树(AVL 树) 1 看一个案例(说明二叉排序树可能的问题) 给你一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在. 左边 BST 存在的问题分析: ...
- (哈夫曼树)HuffmanTree的java实现
参考自:http://blog.csdn.net/jdhanhua/article/details/6621026 哈夫曼树 哈夫曼树(霍夫曼树)又称为最优树. 1.路径和路径长度在一棵树中,从一个结 ...
随机推荐
- kubernetes实战-交付dubbo服务到k8s集群(四)使用blue ocean流水线构建dubbo-demo-service
使用jenkins创建一个新的项目:dubbo-demo,选择流水线构建 勾选保存构建历史和指定项目为参数化构建项目: 添加构建参数:以下配置项,是王导根据多年生产经验总结出来的甩锅大法: 除了bas ...
- 关于st表的推导
#include <bits/stdc++.h> using namespace std; const int maxn=1e6+7; int st[maxn][32]; int a[ma ...
- μC/OS-III---I笔记9---任务等待多个内核对象和任务内建信号量与消息队列
在一个任务等待多个内核对象在之前,信号量和消息队列的发布过程中都有等待多个内核对象判断的函数,所谓任务等待多个内核对象顾名思义就是一任务同时等待多个内核对象而被挂起,在USOC-III中一个任务等待多 ...
- Redis in Action
Redis in Action Redis REmote DIctionary Server(Redis) Redis 是一种开放源代码(BSD许可)的内存中数据结构存储,用作数据库,缓存和消息代理. ...
- css & object-fit & background-image
css & object-fit & background-image object-fit /*default fill */ object-fit: fill|contain|co ...
- navigator.geolocation.getCurrentPosition
navigator.geolocation.getCurrentPosition Geolocation API Specification 2nd Edition W3C Recommendatio ...
- TS type different String / string
TS type different String / string String / string https://stackoverflow.com/questions/14727044/types ...
- SVG & Blob & Base64
SVG & Blob https://developer.mozilla.org/en-US/docs/Web/API/Blob SVG & Base64 https://develo ...
- animejs 动画库
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Error: Actions must be plain objects. Use custom middleware for async actions.
原本代码: import { SREACH_FOCUS, SREACH_BLUR } from "./actionType" export const searchFocus = ...