代码实现

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