本文共 1811 字,大约阅读时间需要 6 分钟。
哈夫曼树?
哈夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树。下面用一幅图来说明。package com.sun.hafumanTree;import java.security.PublicKey;import java.util.ArrayList;import java.util.Collection;import java.util.Collections;import java.util.List;public class hafumantree { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int arr[]={ 13,7,8,3,29,6,1}; Node root=create(arr); preOrder(root); } public static void preOrder(Node root){ if(root !=null){ root.preOrder(); } } //创建哈夫曼树 public static Node create(int[] arr){ //1.遍历数组 //2.数组元素构成node //3.将node放入ArrayList Listnodes=new ArrayList (); for (int value : arr) { Node node=new Node(value); nodes.add(node); } while(nodes.size()>1){ //排序从小到大 Collections.sort(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; //删除掉用过的节点 nodes.remove(leftnode); nodes.remove(rightnode); //将新构建的parent加入到nodes nodes.add(parent); } return nodes.get(0); } //创建节点//让节点实现Comparable接口 static class Node implements Comparable { int value;//节点权值 Node left;//指向左子节点 Node right;//指向右子节点 public Node(int value) { this.value = value; } @Override public String toString() { return "Node [value=" + value + ", left=" + left + ", right=" + right + "]"; } @Override public int compareTo(Node o) { // TODO Auto-generated method stub //表示从小到大排序 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(); } } }}
转载地址:http://tothn.baihongyu.com/