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 { 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); } 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); } 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; } 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()); } } }}
测试结果