Tvorba a prechod stromu Huffmana (Java)
Huffman Tree Creation
Základné predstavenie Huffmanovho stromu:
Keď dáme n váh ako n listových uzlov, zostrojí sa binárny strom. Ak vážená dĺžka cesty (wpl) stromu dosiahne minimum, binárny strom sa nazýva optimálny binárny strom, tiež známy ako Huffmanov strom. Tree) a niektoré knihy sú preložené ako Hoffmanove stromy. Huffmanov strom je strom s najkratšou váženou dĺžkou cesty a uzol s väčšou hmotnosťou je bližšie ku koreňu.
Druhý strom na obrázku nižšie je Huffmanov strom, pretože má najmenšiu hodnotu wpl
Niekoľko dôležitých konceptov Huffmanovho stromu:
1), Cesta a dĺžka cesty : Na strome sa cesta medzi uzlami detí alebo vnukov, na ktorú sa dá dostať z uzla nadol, nazýva cesta. Počet vetiev v ceste sa nazýva dĺžka cesty. Ak je počet vrstiev koreňového uzla určený ako 1, dĺžka cesty od koreňového uzla k uzlu L-tej vrstvy je L-1.
dva), Hmotnosť uzla a vážená dĺžka dráhy : Ak je uzlu v strome priradená hodnota s určitým významom, potom sa táto hodnota nazýva váha uzla. Vážená dĺžka cesty uzla je: súčin dĺžky cesty od koreňového uzla k uzlu a hmotnosti uzla.
3), Vážená dĺžka cesty stromu : Vážená dĺžka cesty stromu je definovaná ako súčet dĺžok váženej cesty všetkých uzlov listov, označených ako WPL (vážená dĺžka cesty), binárny strom s vyššou váhou a bližším uzlom ku koreňovému uzlu. optimálny binárny strom.
4), Najmenšou WPL je Huffmanov strom
Popis názvu:
Dajte vám sekvenciu {13, 7, 8, 3, 29, 6, 1} a požiadajte o prevod na strom Huffman
Kroky na vytvorenie Huffmanovho stromu:
- Triediť od najmenších po najväčšie , Každé dáta, každé dáta sú uzlom, každý uzol možno považovať za najjednoduchší binárny strom
- Odstráňte koreňový uzol Dve s najmenšou hmotnosťou Binárny strom
- Na vytvorenie nového binárneho stromu je váha koreňového uzla nového binárneho stromu súčtom váh koreňových uzlov predchádzajúcich dvoch binárnych stromov.
- Potom tento nový binárny strom znova roztriedte podľa váhy koreňového uzla a opakujte kroky 1-2-3-4, kým nebudú spracované všetky údaje v sekvencii a kým sa nezíska Huffmanov strom.
Kód:
package Tree import java.util.ArrayList import java.util.Collection import java.util.Collections /** * @ClassName: HuffmanTree * @Description: Create a Huffman tree and its preorder traversal * @author Golven * @date October 27, 2019 * */ public class HuffmanTree { public static void main(String[] args) { int[] arr = { 13, 7, 8, 3, 29, 6, 1 } preOrder(createHuffmanTree(arr)) } public static void preOrder(Node root) { if (root != null) { root.preOrder() } else { System.out.println('It's an empty tree') return } } /** * * @Title: createHuffmanTree * @Description: Create a Huffman tree * @param @param arr needs to be created as an array of Huffman numbers * @return Node returns the root node of the tree */ public static Node createHuffmanTree(int[] arr) { // Traverse the arr array and put each element in the arr array into the ArrayList ArrayList<Node> nodes = new ArrayList<Node>() for (int value : arr) {// Perform this for each element in arr, and assign the value of each element to value nodes.add(new Node(value)) } // The processing process is a cyclic process while (nodes.size() > 1) { Collections.sort(nodes)// Sort from smallest to largest // Take out the node with the smallest weight Node leftNode = nodes.get(0) // Take out the second smallest node Node rightNode = nodes.get(1) // Create the root node of the left and right nodes, the value is equal to the sum of the values of the two child nodes Node parent = new Node(leftNode.value + rightNode.value) // Build a binary tree parent.left = leftNode parent.right = rightNode // Delete the processed node from the ArrayList nodes.remove(leftNode) nodes.remove(rightNode) // Add the new node created to the array nodes.add(parent) } return nodes.get(0) } } //Create a Node node class //Because the initialized array needs to be sorted in ascending order, Collections are used, so a comparable interface must be implemented in the Node class class Node implements Comparable<Node> { public int value public Node left public Node right // preorder traversal public void preOrder() { System.out.println(this) if (this.left != null) { this.left.preOrder() } if (this.right != null) { this.right.preOrder() } } public Node(int value) { this.value = value } @Override public String toString() { return 'Node [value=' + value + ']' } @Override // this.value-o.value means ascending order public int compareTo(Node o) { // indicates ascending order return this.value - o.value } }