霍夫曼树
Posted dazhu123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了霍夫曼树相关的知识,希望对你有一定的参考价值。
1:霍夫曼树概念
按照定义;假设右n个权值{w1,w2,...wn},构造一颗带有n个叶子节点的二叉树,每一个叶子节点权值为wk,每个叶子节点的路径长度为lk,其中带权路径长度WPL = w1*l1+w2*l2+w3*l3+...wn*ln,如果该WPL最小则称该二叉树为Huffman树。具体例子往上有很多。
2:霍夫曼树搭建方法
我们可以通过下面方法来搭建霍夫曼树!
- 根据给定的n个权值{w1,w2,...wn},构成的n个二叉树集合F = {T1,T2,...Tn},其中每个二叉树只有根节点,左右子树都为null。
- 在F中选取两个根节点权值最小的树,作为左右子树来构造一棵新的二叉树且该新的二叉树的权重为两个子树的权重之和,且两个子树小权值的左侧,大权值右侧。
- 在F中删除上面的两个较小子树,用新的二叉树来替代。
- 重复2-3步骤即可,直到只有一个树!
3:霍夫曼树Java创建实现
class Huffman{ public Node[] nodes = null;//叶子节点 Node root = null; public Huffman(Node[] nodes){ this.nodes = nodes; } public Node createHuffman(){ Node[] newNodes = nodes; for(int i=0;i<nodes.length-1;i++) newNodes = sort(newNodes); return newNodes[0]; } // 取出nodes前两个小的node,然后组合成一个新的node,取代前面两个小的nodes。 // 其value为前面两个value之和。 // 将新的node的value与剩下的nodes进行排序。 public Node[] sort(Node[] nodes){ //将当前已经排序后的数组,前两个较小的nodes的w相加创建一个新的fatherNode,然后新的fathreNode的左子节点为前面较小的一个node //右子节点为较大的node Node fatherNode = new Node(‘ ‘,nodes[0].w+nodes[1].w,nodes[0].w>nodes[1].w?nodes[1]:nodes[0],nodes[0].w>nodes[1].w?nodes[0]:nodes[1]); Node[] newNodes = new Node[nodes.length-1]; //将新的fatherNode放在新的数组中的首位 newNodes[0] = fatherNode; //将原来的nodes中剩下的元素赋值到newNodes中来 for(int i=2;i<nodes.length;i++){ newNodes[i-1] =nodes[i]; } //针对newNodes进行排序!!!这里newNodes的右侧已经是一个有序的,只要找到 //合适位置,插入后,在进行移动即可! int j=0; for(;j<newNodes.length;j++){ if(newNodes[j].w>newNodes[0].w){ break; } } //j-1位置为目标位置,在j位置之前的node向前移动, Node tempNode = newNodes[0];//暂存newNodes[0]于tempNode for(int i=1;i<j;i++){ newNodes[i-1] = newNodes[i]; } //前面移动后,将存储node存入合适位置。 newNodes[j-1] = tempNode; return newNodes; } public Node getRoot(){ return root; } } class Node{ public char val; public int w; public Node lchild; public Node rchild; public Node(char val,int w,Node lchild,Node rchild){ this.val = val; this.w = w; this.lchild = lchild; this.rchild = rchild; } }
以上是关于霍夫曼树的主要内容,如果未能解决你的问题,请参考以下文章