From 6018c280f0ed635e8e8576c33980957d3c3acf83 Mon Sep 17 00:00:00 2001 From: "haiji.yang" Date: Thu, 31 Dec 2020 12:50:46 +0800 Subject: [PATCH] add HuffManTree :new: :book: --- README.md | 5 + .../book/datastructure/HuffmanTree.md | 141 ++++++++++++++++++ .../img/heffman/HeffmanTree01.jpg | Bin 0 -> 40405 bytes .../img/heffman/HeffmanTree02.jpg | Bin 0 -> 52837 bytes .../tree/huffman/HuffManTree.java | 119 +++++++++++++++ 5 files changed, 265 insertions(+) create mode 100644 note/datastructureAlgorithm/book/datastructure/HuffmanTree.md create mode 100644 note/datastructureAlgorithm/book/datastructure/img/heffman/HeffmanTree01.jpg create mode 100644 note/datastructureAlgorithm/book/datastructure/img/heffman/HeffmanTree02.jpg create mode 100644 source-code/src/main/java/com/javayh/advanced/datastructure/tree/huffman/HuffManTree.java diff --git a/README.md b/README.md index 136f93a..fd6a06a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,10 @@ ![📕 GitLogo](doc/logo/book.jpg) + +

+ License + SpringBoot +

#### Java社区交流群 > 如果您想与小编一同维护或想进入Java社区交流群 > 请添加小编微信: **372787553** (添加备注学习) diff --git a/note/datastructureAlgorithm/book/datastructure/HuffmanTree.md b/note/datastructureAlgorithm/book/datastructure/HuffmanTree.md new file mode 100644 index 0000000..0d87b6f --- /dev/null +++ b/note/datastructureAlgorithm/book/datastructure/HuffmanTree.md @@ -0,0 +1,141 @@ +## 赫夫曼树 + +### 介绍 + +1) 给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。 +2) 赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近 +### 赫夫曼树几个重要概念和举例说明 + +1) 路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路 +中分支的数目称为路径长度。若规定根结点的层数为 1,则从根结点到第 L 层结点的路径长度为 L-1 +2) 结点的权及带权路径长度:若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积 +3) 树的带权路径长度:树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为 WPL(weighted path length) ,权值越大的结点离根结点越近的二叉树才是最优二叉树。 +4) WPL 最小的就是赫夫曼树 + +![HeffmanTree01](img/heffman/HeffmanTree01.jpg) + +### 赫夫曼树创建思路图解 + +给你一个数列 {13, 7, 8, 3, 29, 6, 1},要求转成一颗赫夫曼树. + +- 思路分析(示意图): +{13, 7, 8, 3, 29, 6, 1} + +构成赫夫曼树的步骤: +1) 从小到大进行排序, 将每一个数据,每个数据都是一个节点 , 每个节点可以看成是一颗最简单的二叉树 +2) 取出根节点权值最小的两颗二叉树 +3) 组成一颗新的二叉树, 该新的二叉树的根节点的权值是前面两颗二叉树根节点权值的和 + +4) 再将这颗新的二叉树,以根节点的权值大小 再次排序, 不断重复 1-2-3-4 的步骤,直到数列中,所有的数据都被处理,就得到一颗赫夫曼树 +5) 图解: + +![HeffmanTree02](img/heffman/HeffmanTree02.jpg) + +### 代码实现 + +```java +public class HuffManTree { + public static void main(String[] args) { + int[] array = {13, 7, 8, 3, 29, 6, 1 }; + Node huffmanTree = createHuffmanTree(array); + preOrder(huffmanTree); + } + + /** + * 编写一个前序遍历的方法 + * @param root + */ + public static void preOrder(Node root) { + if (root != null) { + root.preOrder(); + } else { + System.out.println("是空树,不能遍历~~"); + } + } + + /** + *

+ * 构建一个赫夫曼树 + *

+ * @version 1.0.0 + * @since 12/31/2020 + * @param array 需要构建的数组 + * @return com.javayh.advanced.datastructure.tree.huffman.Node 构建后的赫夫曼树 + */ + public static Node createHuffmanTree(int[] array) { + // 第一步为了操作方便 + // 1. 遍历 arr 数组 + // 2. 将 arr 的每个元素构成成一个 Node + // 3. 将 Node 放入到 ArrayList 中 + List nodes = new ArrayList(); + for (int value : array) { + nodes.add(new Node(value)); + } + while (nodes.size() > 1) { + //排序 从小到大 + Collections.sort(nodes); + System.out.println("nodes =" + nodes); + //取出根节点权值最小的两颗二叉树 + //(1) 取出权值最小的结点(二叉树) + Node leftNode = nodes.get(0); + //(2) 取出权值第二小的结点(二叉树) + Node rightNode = nodes.get(1); + //(3)构建一颗新的二叉树 + Node parent = new Node(leftNode.getValue() + rightNode.getValue()); + parent.setLeft(leftNode); + parent.setRight(rightNode); + //(4)从 ArrayList 删除处理过的二叉树 + nodes.remove(leftNode); + nodes.remove(rightNode); + //(5)将 parent 加入到 nodes + nodes.add(parent); + } + return nodes.get(0); + + } + +} + +@Getter +@Setter +class Node implements Comparable { + + private int value; + private Node left; + private Node right; + + Node(int value) { + this.value = value; + } + + /** + * 前序遍历 + */ + public void preOrder() { + System.out.println(this); + if (this.left != null) { + this.left.preOrder(); + } + if (this.right != null) { + this.right.preOrder(); + } + } + + @Override + public int compareTo(Node o) { + // 表示从小到大排序 + return this.value - o.value; + } + + @Override + public String toString() { + return "Node{" + + "value=" + value + + '}'; + } + +} +``` + + + diff --git a/note/datastructureAlgorithm/book/datastructure/img/heffman/HeffmanTree01.jpg b/note/datastructureAlgorithm/book/datastructure/img/heffman/HeffmanTree01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a5c58c5e49a7d54875c4ddc1f7d3dde86b058267 GIT binary patch literal 40405 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 Bnppq< literal 0 HcmV?d00001 diff --git a/note/datastructureAlgorithm/book/datastructure/img/heffman/HeffmanTree02.jpg b/note/datastructureAlgorithm/book/datastructure/img/heffman/HeffmanTree02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1be9ea9f359d84585d43035191bc8201585a4a70 GIT binary patch literal 52837 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 + * 赫夫曼树 + *

+ * + * @author Dylan + * @version 1.0.0 + * @since 2020-12-31 11:50 AM + */ +public class HuffManTree { + public static void main(String[] args) { + int[] array = {13, 7, 8, 3, 29, 6, 1 }; + Node huffmanTree = createHuffmanTree(array); + preOrder(huffmanTree); + } + + /** + * 编写一个前序遍历的方法 + * @param root + */ + public static void preOrder(Node root) { + if (root != null) { + root.preOrder(); + } else { + System.out.println("是空树,不能遍历~~"); + } + } + + /** + *

+ * 构建一个赫夫曼树 + *

+ * @version 1.0.0 + * @since 12/31/2020 + * @param array 需要构建的数组 + * @return com.javayh.advanced.datastructure.tree.huffman.Node 构建后的赫夫曼树 + */ + public static Node createHuffmanTree(int[] array) { + // 第一步为了操作方便 + // 1. 遍历 arr 数组 + // 2. 将 arr 的每个元素构成成一个 Node + // 3. 将 Node 放入到 ArrayList 中 + List nodes = new ArrayList(); + for (int value : array) { + nodes.add(new Node(value)); + } + while (nodes.size() > 1) { + //排序 从小到大 + Collections.sort(nodes); + System.out.println("nodes =" + nodes); + //取出根节点权值最小的两颗二叉树 + //(1) 取出权值最小的结点(二叉树) + Node leftNode = nodes.get(0); + //(2) 取出权值第二小的结点(二叉树) + Node rightNode = nodes.get(1); + //(3)构建一颗新的二叉树 + Node parent = new Node(leftNode.getValue() + rightNode.getValue()); + parent.setLeft(leftNode); + parent.setRight(rightNode); + //(4)从 ArrayList 删除处理过的二叉树 + nodes.remove(leftNode); + nodes.remove(rightNode); + //(5)将 parent 加入到 nodes + nodes.add(parent); + } + return nodes.get(0); + + } + +} + +@Getter +@Setter +class Node implements Comparable { + + private int value; + private Node left; + private Node right; + + Node(int value) { + this.value = value; + } + + /** + * 前序遍历 + */ + public void preOrder() { + System.out.println(this); + if (this.left != null) { + this.left.preOrder(); + } + if (this.right != null) { + this.right.preOrder(); + } + } + + @Override + public int compareTo(Node o) { + // 表示从小到大排序 + return this.value - o.value; + } + + @Override + public String toString() { + return "Node{" + + "value=" + value + + '}'; + } + +}