• java赫夫曼树(含java赫夫曼树代码)


    目录

    一:赫夫曼树的介绍

    二:赫夫曼树的构建

    三:赫夫曼树的代码展示


    一:赫夫曼树的介绍

    给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度(WPL)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

    二:赫夫曼树的构建

     假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为:

    例如有四个叶子节点 a b c d 权值分别为 12、5、6、21
    创建赫夫曼树前森林如下


    (1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);

    (2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;

    在森林中取出 b c节点 形成一棵新树M


    (3)从森林中删除选取的两棵树,并将新树加入森林;

    将新树M添加到森林后 森林如下

    (4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。
      **  4.1重复步骤(2)

    在森林中取出权为11的节点以及a节点组成一棵新树N

      **  4.2重复步骤(3)

    将新树N添加到森林中 森林如下

      **  4.3重复步骤(2)

    在森林中取出b节点和权为23的节点组成一棵新树S


    则新树S就是我们要创建的赫夫曼树

    三:赫夫曼树的代码展示

    1. package tree;
    2. public class HufmNode implements Comparable{
    3. private int values;
    4. private HufmNode left;
    5. private HufmNode right;
    6. public HufmNode(int values) {
    7. this.values = values;
    8. }
    9. @Override
    10. public int compareTo(HufmNode node) {
    11. return this.getValues() - node.getValues();
    12. }
    13. @Override
    14. public String toString() {
    15. return "HufmNode [values=" + getValues() + "]";
    16. }
    17. //前序遍历
    18. public void preSelect() {
    19. System.out.println(this);
    20. if(this.getLeft() != null) {
    21. this.getLeft().preSelect();
    22. }
    23. if(this.getRight() != null) {
    24. this.getRight().preSelect();
    25. }
    26. }
    27. public int getValues() {
    28. return values;
    29. }
    30. public void setValues(int values) {
    31. this.values = values;
    32. }
    33. public HufmNode getLeft() {
    34. return left;
    35. }
    36. public void setLeft(HufmNode left) {
    37. this.left = left;
    38. }
    39. public HufmNode getRight() {
    40. return right;
    41. }
    42. public void setRight(HufmNode right) {
    43. this.right = right;
    44. }
    45. }
    1. package tree;
    2. import java.util.ArrayList;
    3. import java.util.Collections;
    4. import java.util.List;
    5. public class HufmTree {
    6. public static void main(String[] args) {
    7. int[] arr = new int[] {13,7,8,29,6,1};
    8. HufmNode hfmn= creatHufmTree(arr);
    9. hfmn.preSelect();
    10. }
    11. //把数列转为赫夫曼树
    12. public static HufmNode creatHufmTree(int[] arr) {
    13. //遍历数组
    14. //将元素转为Node
    15. //将Node放入集合中并且排序,从小到大
    16. List nodes = new ArrayList();
    17. for(int i: arr) {
    18. nodes.add(new HufmNode(i));
    19. }
    20. //从小到大排序
    21. while(nodes.size() > 1) {
    22. //获取最小元素
    23. Collections.sort(nodes);
    24. HufmNode left = nodes.get(0);
    25. HufmNode right = nodes.get(1);
    26. //创建新的结点
    27. HufmNode root = new HufmNode(left.getValues() + right.getValues());
    28. root.setLeft(left);
    29. root.setRight(right);
    30. //删除
    31. nodes.remove(left);
    32. nodes.remove(right);
    33. //加
    34. nodes.add(root);
    35. }
    36. return nodes.get(0);
    37. }
    38. public static void preSelect(HufmNode root) {
    39. if(root == null) {
    40. System.out.println("空树...");
    41. }else {
    42. root.preSelect();
    43. }
    44. }
    45. }

  • 相关阅读:
    【Android】-- 向上个和下个Activity页面发送数据
    分类算法实现
    css动画效果(关键帧)
    SQL必需掌握的100个重要知识点:组合查询
    高效使用表的.frm和.idb文件备份MySQL表
    澳大利亚网络空间安全体系建设论析
    IP详细地理位置查询:技术原理与应用实践
    黑猫带你学Makefile第9篇:menuconfig/Kconfig/deconfig/.config及Makefile之间的关系
    34. 在排序数组中查找元素的第一个和最后一个位置
    MapBox GL JS出现“Unimplemented type: 7”问题的解决办法
  • 原文地址:https://blog.csdn.net/qq_56127002/article/details/126521786