Huffman树的简单实现
2016-04-13 20:48
387 查看
1、定义
给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
2、实现思想
树节点放入优先队列,每次取出两个最小的构造新节点,并把新节点加入队列,直到队列只剩下一个元素,此元素即为构造的树的树根。(学会使用抽象数据结构来实现更加高级的功能)。
Java代码如下:
给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
2、实现思想
树节点放入优先队列,每次取出两个最小的构造新节点,并把新节点加入队列,直到队列只剩下一个元素,此元素即为构造的树的树根。(学会使用抽象数据结构来实现更加高级的功能)。
Java代码如下:
import java.util.PriorityQueue; import java.util.Queue; /** * Created by lemon on 2016/4/13. */ /*定义树节点*/ class Node implements Comparable<Node> { public int val; public Node left; public Node right; public Node(int val){ this.val=val; left=null; right=null; } @Override public int compareTo(Node o) { return this.val-o.val; } } public class HuffTree { /*构造huffman树*/ public static Node HuffTree(int [] array){ Queue<Node> queue=new PriorityQueue<Node>(); for(int i : array) queue.add(new Node(i)); while(queue.size()>1){ Node node1=queue.poll(); Node node2=queue.poll(); Node node3=new Node(node1.val+node2.val); node3.left=node1; node3.right=node2; queue.add(node3); } return queue.poll(); } //先序遍历树 public static void preOrder(Node root){ if(root!=null){ System.out.print(root.val+" "); preOrder(root.left); preOrder(root.right); } } public static void main(String args[]){ int array[]={1,2,3,4,5,6,7,8}; Node root=HuffTree(array); preOrder(root); System.exit(0); } }
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- 一波二叉树遍历问题的C++解答实例分享
- 举例讲解C语言程序中对二叉树数据结构的各种遍历方式
- C++非递归队列实现二叉树的广度优先遍历
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort