> 文档中心 > 创建一颗哈夫曼树的代码实现(使用java语言)

创建一颗哈夫曼树的代码实现(使用java语言)


节点定义

import java.util.Comparator;public class Node{    private Node left;  //    private Integer data;//数据域    private Node right;    public Node() {    }    public Node(Integer data) { this.data = data;    }    public Node(Node left, Integer data, Node right) { this.left = left; this.data = data; this.right = right;    }    public Node getLeft() { return left;    }    public void setLeft(Node left) { this.left = left;    }    public Integer getData() { return data;    }    public void setData(Integer data) { this.data = data;    }    public Node getRight() { return right;    }    public void setRight(Node right) { this.right = right;    }}

创建huffman树

import java.util.*;public class HuffmanTree {    /**     * 测试     * @param args     */    public static void main(String[] args) { Node node0 = new Node(6); Node node1 = new Node(1); Node node2 = new Node(3); Node node3 = new Node(5); Node node4 = new Node(4); Node node5 = new Node(7); List<Node> nodes = new ArrayList<>(); nodes.add(node0); nodes.add(node1); nodes.add(node2); nodes.add(node3); nodes.add(node4); nodes.add(node5); Node huffmanTree = getHuffmanTree(nodes); System.out.println("按照层次遍历输出哈夫曼树:"); level(huffmanTree);    }    /**     * 生成哈夫曼树     * @param arr     * @return     */    public static Node getHuffmanTree(List<Node> arr) { while (arr.size()>1){     Node[] nodes = getTowMinWeight(arr);     Node node = new Node();     node.setLeft(nodes[1]);     node.setRight(nodes[0]);     node.setData(nodes[0].getData()+ nodes[1].getData());     arr.remove(arr.size()-1);     arr.remove(arr.size()-1);     arr.add(node); } return arr.get(0);    }    /**     * 从集合中返回两个最大的节点     * @param arr     * @return     */    public static Node[] getTowMinWeight(List<Node> arr) { arr.sort(Comparator.comparing(Node::getData).reversed()); Node weights[] = {arr.get(arr.size()-1), arr.get(arr.size()-2)}; return weights;    }    /**     * 二叉树层次遍历     * @param node     */    public static void level(Node node) { ArrayList<Node> list = new ArrayList<>(); list.add(node); while (list.size() != 0) {     Node firstNode = list.get(0);     System.out.print(firstNode.getData() + "  ");     for (int j = 0; j < list.size() - 1; j++) {  list.set(j, list.get(j + 1));     }     list.remove(list.size() - 1);     if (firstNode.getLeft() != null) {  list.add(firstNode.getLeft());     }     if (firstNode.getRight() != null) {  list.add(firstNode.getRight());     } }    }}

测试结果

在这里插入图片描述