简介

哈夫曼树(Huffman)树又称最优二叉树,是指对于一组带有确定权值的叶子结点所构造的具有带权路径长度最短的二叉树。从树中一个结点到另一个结点之间的分支构成了两结点之间的路径,路径上的分支个数称为路径长度。二叉树的路径长度是指由根结点到所有叶子结点的路径长度之和。如果二叉树中的叶子结点都有一定的权值,则可将这一概念拓展:设二叉树具有n个带权值的叶子结点,则从根结点到每一个叶子结点的路径长度与该叶子结点权值的乘积之和称为二叉树路径长度,记做:

WPL = W1L1 + W2L2 + ...... + WnLn;

构建过程

① 对数据中出现过的元素各产生一个树叶节点,并赋予其出现的频率。

② 令N为T1和T2的父节点,其中T1和T2是出现频率最低的两个节点,令N的频率为T1和T2的频率之和

③ 消去两个节点,插入N节点,重复前面的步骤。

代码实现

HuffmanTree.java

import java.util.ArrayDeque;

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

public class HaffmanTree {nodes;

private Node root;

// 实现排序接口,添加结点自动排序,从小到大排序

private int value;

private Node left;

private Node right;

public Node(int value) {

this.value = value;

}

public Node getLeft {

return left;

}

public void setLeft(Node left) {

this.left = left;

}

public Node getRight {

return right;

}

public void setRight(Node right) {

this.right = right;

}

@Override

public int compareTo(Node o) {

return this.value - o.value;

}

}

public HaffmanTree {}

public void bulidHaffmanTree(int arr) {

nodes = new ArrayList<>;

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

nodes.add(new Node(arr[i]));

}

root = createHaffmanTree(nodes);

}nodes) {

while (nodes.size > 1) {

// 排序,每次取最小的两个结点

Collections.sort(nodes);

// 获得权值最小的两个结点,左结点大于右结点

Node leftChild = nodes.get(1);

Node rightChild = nodes.get(0);

// 生成新结点

Node newNode = new Node(leftChild.value + rightChild.value);

newNode.left = leftChild;

newNode.right = rightChild;

// 删除权值最小的两个结点

nodes.remove(0);

nodes.remove(0);

// 将新结点加入到集合中

nodes.add(newNode);

}

return nodes.get(0);

}

// 先序遍历

public void preOrder {

preOrder(root);

}

private void preOrder(Node root) {stack = new ArrayDeque<>;

while (root != null || !stack.isEmpty) {

System.out.println(root.value);

stack.push(root);

root = root.left;

}

if (!stack.isEmpty) {

root = stack.pop;

root = root.right;

}

}

// 中序遍历

public void inOrder {

preOrder(root);

}

private void inOrder(Node root) {

while (root != null || !stack.isEmpty) {

stack.push(root);

root = root.left;

}

if (!stack.isEmpty) {

root = stack.pop;

System.out.println(root.value);

root = root.right;

}

}

// 非递归后序遍历

public void postOrder {

postOrder(root);

}

private void postOrder(Node root) {

Node cur = root;

Node pre = null;

while (cur != null || !stack.isEmpty) {

while (cur != null) {

stack.push(cur);

cur = cur.left;

}

cur = stack.peek;

if (cur.right == null || cur.right == pre) {

System.out.print(cur.value + " ");

pre = cur;

stack.pop;

cur = null;

} else {

cur = cur.right;

}

}

}

// 层序遍历

public void levelOrder {

levelOrder(root);

}

private void levelOrder(Node root) {ArrayDequequeue = new ArrayDeque<>;

Node curr = root;

if (curr == null)

return;

queue.add(curr);

while (!queue.isEmpty) {

curr = queue.remove;

System.out.print(curr.value + " ");

if (curr.left != null)

queue.add(curr.left);

if (curr.right != null)

queue.add(curr.right);

}

}

}

测试代码

HuffmanTreeTest.java

public class HaffmanTreeTest {

public static void main(String args) {

int arr = {13, 7, 8, 3, 29, 6, 1};

HaffmanTree haffmanTree = new HaffmanTree;

haffmanTree.bulidHaffmanTree(arr);

haffmanTree.postOrder;

System.out.println;

haffmanTree.levelOrder;

}

}

java 实现最优二叉树_哈夫曼树(最优二叉树) - Java实现相关推荐

  1. java 实现最优二叉树_哈夫曼树(最优二叉树)及其Java实现

    一.定义 一些定义: 节点之间的路径长度:在树中从一个结点到另一个结点所经历的分支,构成了这两个结点间的路径上的经过的分支数称为它的路径长度 树的路径长度:从树的根节点到树中每一结点的路径长度之和.在 ...

  2. 最优二叉树(哈夫曼树)Java实现

    此篇博客讲最优二叉树也叫哈夫曼树的原理,以及构建步骤,还有哈夫曼编码原理.建议有二叉树基础朋友学习交流.对二叉树基础可以看我的另外一篇博客二叉树的构建以及遍历 文章目录 哈夫曼树引出: 哈夫曼树原理及 ...

  3. JAVA实现二叉树带权路径长度和_哈夫曼树的构建与最小带权路径长度

    注意:哈夫曼树并不唯一,但带权路径长度一定是相同的. 二叉树:每个结点最多含有两个子树的树称为二叉树. 定理:对于具有n个叶子结点的哈夫曼树,共有2n-1个结点. 哈夫曼树介绍 1哈夫曼树的定义 哈夫 ...

  4. 哈夫曼编码(基于哈夫曼树-最优二叉树,不唯一)、B树(b-树)、B+树

    整合自: http://blog.csdn.net/shuangde800/article/details/7341289 http://www.cnblogs.com/Jezze/archive/2 ...

  5. java哈夫曼树编码_哈夫曼树的编码实验

    Java哈夫曼编码实验--哈夫曼树的建立,编码与解码 建树,造树,编码,解码 一.哈夫曼树编码介绍 1.哈夫曼树: (1)定义:假设有n个权值{w1, w2, ..., wn},试构造一棵含有n个叶子 ...

  6. 最优二叉树(哈夫曼树)知识点

    路径:在一棵树中从一个结点往下到孩子或孙子结点之间的通路 结点的路径长度:从根节点到该节点的路径上分支的数目 树的路径长度:树中每个结点的路径长度之和 结点的权:给树中的结点赋予一个某种含义的值,则该 ...

  7. WPL、最优二叉树(哈夫曼树)

    定义:最优树,带权路径长度最短的树 基本概念: 1:路径长度:从树的一个结点到另一个结点的路径中,路径上的分支数目为路径长度 2:树的路径长度:从根结点到每个结点的路径长度之和 3:树的带权路径长度( ...

  8. java哈夫曼编码与译码_哈夫曼树与编码译码实现

    标签: 一.哈弗曼树的基本概念. 哈夫曼树,又称最优树,是一类带权路径长度最短的树.下面有几个概念: (1)路径. 树中一个结点到另一个结点之间的分支构成这两个结点之间的路径. (2)路径长度. 路径 ...

  9. 深入学习二叉树(三) 霍夫曼树

    深入学习二叉树(三) 霍夫曼树 1 前言 霍夫曼树是二叉树的一种特殊形式,又称为最优二叉树,其主要作用在于数据压缩和编码长度的优化. 2 重要概念 2.1 路径和路径长度 在一棵树中,从一个结点往下可 ...

最新文章

  1. 主要元素(超过一半元素)
  2. 测试简易混沌振荡电路一些因素的影响
  3. multiple definition of
  4. 022_配置configuration
  5. Android Studio 点击运行总是debug
  6. React Native面试知识点
  7. OJ1042: 数列求和3(递推思想)
  8. c++求区间第k大数_翔哥炒股经验23 K线形态学50节 第10节:K线区间震荡
  9. 关于Spring的几个问题
  10. php accept-length,php中Accept-Length获取不到下载文件的大小
  11. CentOS下搭建使用gitlab 和tortoiseGit使用
  12. 计算机专业学历真的那么重要吗?又该怎么做
  13. U3D中物体渐隐和闪烁的方法
  14. TrustedInstaller
  15. C++设计模式 命令模式(服务员命令厨师)
  16. Android自定义控件之拓展TextView(ExpandTextView)
  17. 【新手入门必看】MaixPy 图像基础知识
  18. Dev-C++ win10中文乱码
  19. oracle-临时表
  20. Java中扫雷游戏的递归算法_扫雷之递归

热门文章

  1. 20211403 左颖 Python技能树及CSDN MarkDown编辑器测评
  2. 数据仓库工具箱的考点参考
  3. 电脑连接电视以及电视盒子
  4. 卡尔曼(Kalman)滤波(三)-- 新息
  5. C++11多线程编程(八)——死锁问题
  6. 学习ActionBar
  7. 计算机硬件知识总结,计算机硬件知识总结(三)
  8. 用css3实现摩天轮旋转的动画效果
  9. gcCov:全球冠状病毒研究知识图谱数据库
  10. iTerm2中配置SSH连接Linux服务器的快捷方法