zcq

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