赞
踩
给定 n 个权值作为 n 个叶子节点,构造一棵二叉树,若该树的带权路径长度(Weighted Path Length of Tree)达到最小, 称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。
哈夫曼树是带权路径长度最短的树,权值较大的节点离根较近。
基本步骤:
图解步骤
以数组{13, 7, 8, 3, 29, 6, 1}为例,要求转成一颗赫夫曼树
package huffmanTree; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class HuffmanTreeDemo { public static void main(String[] args) { int arr[] = {13,7,8,3,29,6,1}; Node root = creatHuffmanTree(arr); preOrder(root); } public static void preOrder(Node root){ if(root != null){ root.preOrder(); }else{ System.out.println("树是空树"); } } public static Node creatHuffmanTree(int arr[]){ //为了操作方便 //1.先遍历arr数组 //2.将arr的每个元素构成一个Node //3.将Node放入到ArrayList中 List<Node> nodes = new ArrayList<>(); for(int value:arr){ nodes.add(new Node(value)); } while(nodes.size() > 1){ Collections.sort(nodes); System.out.println("从小到大排序后的权值为" + nodes); //取出根节点权值最小的两个节点 Node leftNode = nodes.get(0); Node rightNode = nodes.get(1); //构建一个新的二叉树 Node parent = new Node(leftNode.value + rightNode.value); parent.left = leftNode; parent.right = rightNode; //从ArrayList中删除处理过的二叉树节点 nodes.remove(leftNode); nodes.remove(rightNode); //将parent加入到nodes中 nodes.add(parent); } //返回哈夫曼树的root节点 return nodes.get(0); } } //为了让node对象持续排序Collections集合排序 //让node实现comparable接口 class Node implements Comparable<Node>{ int value;//节点权值 Node left;//左子节点 Node right;//右子节点 public Node(int value){ this.value = value; } @Override public String toString() { return "Node{" + "value=" + value + '}'; } @Override public int compareTo(Node o) { return this.value - o.value; } //前序遍历 public void preOrder(){ System.out.println(this); if(this.left != null){ this.left.preOrder(); } if(this.right != null){ this.right.preOrder(); } } }
实现结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。