文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java编程内功-数据结构与算法「赫夫曼树」

2024-12-03 08:07

关注

赫夫曼树是带权路径长度最短的树,权值较大的节点离根很近。

几个重要概念

  1. **路径和路径长度:**在一颗树种,从一个节点往下可以达到的孩子或孙子节点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根节点的层数为1,则从根节点到L层节点的路径长度为:L-1.
  2. **节点的权和带权路径长度:**若将树种的节点赋给一个有某种含义的数值,则这个数值称为该节点的权。节点的带权路径长度为:从根节点到该节点之间的路径长度与该节点的权的乘积。
  3. 树的带权路径长度:树的带权路径长度规定为所有叶子节点的带权路径长度之和,即为WPL(weighted path length),权值越大的节点离根节点越近的二叉树才是最优二叉树。
  4. WPL最小的就是赫夫曼树

wpl=59的是赫夫曼树

赫夫曼树创建思路

给定一个数列{13,7,8,3,29,6,1},要求转成一个赫夫曼树

  1. 从小到大进行排序,将每一个数据都看成一个节点,每个节点可以看成是一颗最简单的二叉树。
  2. 取出根节点权值最小的两颗二叉树。
  3. 组成一颗新的二叉树,该新的二叉树的根节点的权值就是前面两个二叉树根节点权值的和。
  4. 再将这个新的二叉树,以根节点的权值大小排次排序,不断重复1-2-3-4的步骤,直到数列中,所有的数据都被处理,就得到一颗赫夫曼树。如下图所示:

代码案例

  1. package com.xie.huffmantree; 
  2.  
  3. import java.util.ArrayList; 
  4. import java.util.Collections; 
  5. import java.util.List; 
  6.  
  7. public class HuffmanTree { 
  8.     public static void main(String[] args) { 
  9.         int[] arr = {13, 7, 8, 3, 29, 6, 1}; 
  10.         Node huffmanTree = createHuffmanTree(arr); 
  11.         //前序遍历 
  12.         preOrder(huffmanTree); 
  13.          
  14.     } 
  15.  
  16.     //创建赫夫曼树 
  17.     public static Node createHuffmanTree(int[] arr) { 
  18.         //第一步为了操作方便 
  19.         //1.遍历 arr 数组 
  20.         //2.将 arr 的每个元素构成一个Node 
  21.         //3.将 Node 放入 ArrayList中 
  22.         List nodes = new ArrayList<>(); 
  23.         for (int value : arr) { 
  24.             nodes.add(new Node(value)); 
  25.         } 
  26.  
  27.         while (nodes.size() > 1) { 
  28.             //排序 从小到大 
  29.             Collections.sort(nodes); 
  30.             System.out.println("nodes = " + nodes); 
  31.  
  32.             //取出根节点权值最小的两颗二叉树 
  33.             //(1)取出权值最小的节点(二叉树) 
  34.             Node leftNode = nodes.get(0); 
  35.             //(2) 取出权值第二小的节点(二叉树) 
  36.             Node rightNode = nodes.get(1); 
  37.  
  38.             //(3) 构建一颗新的二叉树 
  39.             Node parent = new Node(leftNode.value + rightNode.value); 
  40.             parent.left = leftNode; 
  41.             parent.roght = rightNode; 
  42.  
  43.             //(4) 从ArrayList中删除处理过的二叉树 
  44.             nodes.remove(leftNode); 
  45.             nodes.remove(rightNode); 
  46.  
  47.             //(5) 将parent加入nodes 
  48.             nodes.add(parent); 
  49.         } 
  50.  
  51.         //返回赫夫曼树的root节点 
  52.         return nodes.get(0); 
  53.  
  54.     } 
  55.  
  56.     public static void preOrder(Node node) { 
  57.         if (node != null) { 
  58.             node.preOrder(); 
  59.         } else { 
  60.             System.out.println("是空树,不能遍历~~"); 
  61.         } 
  62.  
  63.     } 
  64.  
  65. //创建节点类,为了让Node对象支持排序,实现了Comparble接口 
  66. class Node implements Comparable { 
  67.     //权值 
  68.     int value; 
  69.     //指向左子节点 
  70.     Node left
  71.     //指向右子节点 
  72.     Node roght; 
  73.  
  74.     //写一个前序遍历 
  75.     public void preOrder() { 
  76.         System.out.println(this); 
  77.         if (this.left != null) { 
  78.             this.left.preOrder(); 
  79.         } 
  80.  
  81.         if (this.roght != null) { 
  82.             this.roght.preOrder(); 
  83.         } 
  84.     } 
  85.  
  86.     public Node(int value) { 
  87.         this.value = value; 
  88.     } 
  89.  
  90.     @Override 
  91.     public String toString() { 
  92.         return "Node{" + 
  93.                 "value=" + value + 
  94.                 '}'
  95.     } 
  96.  
  97.     @Override 
  98.     public int compareTo(Node o) { 
  99.         //从小到大进行排序 
  100.         return this.value - o.value; 
  101.     } 

 【编辑推荐】

  1. 跟妹妹聊到 Java 16 新特征,真香!
  2. IT项目过多,管理太难?NO!因为你还没学会这七招
  3. 学了五年Python,这些网站让我相见恨晚,快来一起见识一下
  4. Java都到16了,为什么都还在用8,是越做越烂了么?
  5. 实在太神奇!Windows10这些黑科技小功能你都用过吗

 

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯