该思想借鉴于《2019版数据结构高分笔记(c语言版)》- 第7版

最近事多,有时间会把思路在这里阐述一下

代码思路如下/*

*

* add() 输入names[] weights[]

* sort()排序

* generateTree()生成树

* preOrder() 先序遍历生成节点编码code

* inOrder() 前序遍历输出编码

*

* root

* / \

* B tem

* / \

* D tem

* / \

* C tem

* / \

* A tem

* / \

* E F

* */代码如下package COURSE;

import java.util.LinkedList;

public class HuffmanTree {

private class Node {

E data;

double weight;

Node left, right;

String code = null;

// 叶子节点

public Node(E data, double weight) {

this.data = data;

this.weight = weight;

left = null;

right = null;

}

// 中间节点

public Node(Node left, Node right) {

this.data = null;

this.weight = left.weight + right.weight;

this.left = left;

this.right = right;

}

@Override

public String toString() {

StringBuilder res = new StringBuilder();

res.append("(data = ").append(data).append(", weight = ").append(weight).append("," + "code=").append(code).append(")");

return res.toString();

}

}

int size;

Node root;

LinkedList nodes = new LinkedList<>();

private String nodeCode = ""; // 左0 右1

public HuffmanTree() {

size = 0;

root = null;

}

// 添加: 批量添加

public void add(Character[] names, Double[] weights) {

for (int i = 0; i < names.length; i++) {

add((E) names[i], weights[i]);

}

}

private void add(E data, double weight) {

Node node = new Node(data, weight);

nodes.add(node);

size++;

}

// 排序

private void sort() {

LinkedList newNodes = new LinkedList<>();

while (!nodes.isEmpty()) {

int index = 0;

for (int i = 0; i < nodes.size(); i++) {

if (nodes.get(index).weight < nodes.get(i).weight) {

index = i;

}

}

newNodes.add(nodes.remove(index));

}

nodes = newNodes;

System.out.print("排序结果为");

System.out.println(nodes);

}

// 生成树

private void generateTree() {

Node min1 = nodes.removeLast();

Node min2 = nodes.removeLast();

Node temNode = new Node(min1, min2);

while (!nodes.isEmpty()) {

Node minNode = nodes.removeLast();

temNode = new Node(minNode, temNode);

}

this.root = temNode;

}

// 私有:前序遍历 + 编码

private void preOrder(Node node) {

Node cur = node;

if (cur.left != null) {

nodeCode = nodeCode + "0";

preOrder(cur.left);

}

if (cur.right != null) {

nodeCode = nodeCode + "1";

preOrder(cur.right);

}

if (cur.left == null && cur.right == null && cur.data != null) {

cur.code = nodeCode;

System.out.println("节点" + cur.data + "的编码为" + cur.code);

nodeCode = nodeCode.substring(0,nodeCode.length() -1);

return;

}

}

// 中序遍历

public void inOrder() {

sort(); // 排序

generateTree(); // 生成树

preOrder(root);// 编码

inOrder(root); // 遍历

}

// 私有 : 中序遍历递归

private void inOrder(Node node) {

if (node == null) {

return;

}

inOrder(node.left);

if (node.data != null) {

System.out.println(node);

}

inOrder(node.right);

}

public static void main(String[] args) {

Character[] names = {'A', 'B', 'C', 'D', 'E', 'F'};

Double[] weights = {15.0, 30.0, 20.0, 25.0, 3.0, 7.0};

HuffmanTree huffmanTree = new HuffmanTree();

huffmanTree.add(names, weights);

huffmanTree.inOrder();

}

}

huffman树java_HuffmanTree - java实现相关推荐

  1. Java学习——数据结构——Huffman树

    学习尚硅谷韩顺平老师的Java数据结构笔记,详情请移步网站 1.介绍 (1) 给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树, ...

  2. 文件压缩 Huffman编码 (java)

    用到的知识点有: 1,二叉堆Heap的设计,实现堆排序 2,二叉树的链式构造 3,Huffman编码以及Huffman树的构建 4,二进制文件I/O流 的读写 5,比特输出流的类设计 程序目录: 1 ...

  3. Huffman树压缩和解压文件

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

  4. Huffuman树(java)

    基础练习 Huffuman树 描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Huff ...

  5. 闲来无事写写-Huffman树的生成过程

    前言:最近项目上一直没事干,感觉无聊到了极点,给自己找点事做,补一下大学没有完成的事情,写一个huffman算法Java版的,学校里面写过c语言的. 因为很久没搞数据结构和算法这方面了(现在搞Java ...

  6. Huffman树的原理以及代码构建

    我们的目标认识只是基础,代码实现是才是核心 1.Huffman树的定义: 从树中一个结点到另一个结点的之间的分支构成两个结点之间的路径,路径上的分支数称为路径长度.那么树的路径长度就是从树根到每一个结 ...

  7. Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。

    Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Huffman树的过程如下: 1. 找到{p ...

  8. huffman树和huffman编码

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

  9. 双数组Trie树(DoubleArrayTrie)Java实现

    http://www.hankcs.com/program/java/%E5%8F%8C%E6%95%B0%E7%BB%84trie%E6%A0%91doublearraytriejava%E5%AE ...

最新文章

  1. 分布式平台下的HS(High-Security) --Apache Shiro API(介绍)
  2. 神经网络和深度学习各类概念名词解析
  3. 【Python】Docx解析
  4. 使用Async对Angular异步代码进行单元测试
  5. java拆分单元格_Java 拆分Excel单元格数据为多列
  6. linux某个线程信号唤醒,linux多线程编程--信号量和条件变量 唤醒丢失事件
  7. python socket能做什么_[python]初探socket
  8. [转]Java 通过JDBC连接Mysql数据库的方法和实例【图文说明】
  9. python内置数据结构_Python内置数据结构(一)
  10. 计算机应用基础doc,计算机应用基础.doc
  11. groupadd命令详解(实例)
  12. 软件工程:可行性研究
  13. 易鲸捷数据库创建全局递增序列和oracle的RAC模式下的全局递增序列类似
  14. ms17010漏洞复现-2003
  15. 每天一个JavaScript小特效——会魔法的旋转魔方相册
  16. 如何同步微信信息php,微信小程序中实现同步请求的方法
  17. 2022年打工人转行实录!你后悔转行了吗?
  18. Redis基本使用|基本命令|redis事务|Jedis|持久化|订阅|集群|
  19. Android 9 功能和 API
  20. DNS配置异常无法上网(明明有网,但是网页打不开了?)

热门文章

  1. 阿里开发者招聘节 | 面试题01:如何实现一个高效的单向链表逆序输出?
  2. Cloud Toolkit 部署应用到阿里云轻量应用服务器
  3. 深信服何朝曦:托管云为用户上云提供第三种选择
  4. 500道Java 必备面试题答案(过后即删)
  5. 阿里云数字政府市场份额第一,同比增速102.57%
  6. 填补服务机器人市场空白,九号机器人提供智能服务场景解决方案!
  7. Spring精华问答 | 为何使用Spring?
  8. 火柴人_火柴人战争遗产修改无限金币钻石
  9. python依赖注入_如何做依赖注入python方式?
  10. php 网站移动端自适应,HTML5 移动端自适应布局