这篇文章主要介绍了Java数据结构之实现哈夫曼树的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。
一、与哈夫曼树相关的概念
概念含义1。路径从树中一个结点到另一个结点的分支所构成的路线2。路径长度路径上的分支数目3。树的路径长度长度从根到每个结点的路径长度之和4。带权路径长度结点具有权值,从该结点到根之间的路径长度乘以结点的权值,就是该结点的带权路径长度5。树的带权路径长度树中所有叶子结点的带权路径长度之和二,什么是哈夫曼树
定义:
引用><李>
给定n个权值作为n个叶子结点,构造出的一棵带权路径长度(WPL)最短的二叉树,叫哈夫曼树(),也被称为最最优二叉树。李李
> <>WPL:加权路径长度树树的带权路径长度
李>哈夫曼树的特点:
引用>1。权值越大的结点,距离根节点越近,
2。树中没有度为1的结点,哈夫曼树的度只能是0或1,
3。带权路径长度最短的一棵二叉树;
判断下图三个二叉树那个是哈夫曼树吗?
引用><李>
当然是WPL最小的树啦,即中间的二叉树是也;
李>那么我们是如何手动构造出一棵哈夫曼树的呢?
三、哈夫曼树的构造方法
构造哈夫曼树的步骤:
引用>1。把所有结点的权值按照从小到大的顺序进行排序;
2。取出根节点权值最小的两棵二叉树;
3。组成一棵新的二叉树,这课新二叉树的根节点的权值是前面两棵二叉树权值的和
4。再将这棵新的二叉树,以根节点的权值大小进行排序,不断重复1-2-3-4的步骤,直到给定序列中的所有权值都被处理,我们就得到了一棵哈夫曼树。
<强>[图解分析构造过程)强>
下面以序列{13 7 8 3}为例,图解构造哈夫曼树的过程
引用>首先对序列进行升序排列,得到{3、7、8、13};
取出权值最小的两个结点3,7组成一棵二叉树,根节点是权值为10的结点;
在原序列中去除步骤2中已经被使用了的3和7,并把新的结点权值10加入到序列中并重新排的序,得到{8、10、13};
再次取出权值最小的两个节点8、10组成一棵根节点为18的二叉树,然后我们去除序列中的8日,10日将18添加到序列中并排序,得到了{13日18};
将序列{13日18}取出构成一棵新的二叉树,权值为31日此时序列中只剩下了这31个结点,他是这个哈夫曼树的根节点;
至此,{13 7 8 3}的哈夫曼树构建完毕。
四、哈夫曼树的代码实现
结点类
引用>package DataStrcture.huffmantreedemo; public class  HTreeNode implements Comparable< HTreeNode> { ,,//,,,public HTreeNode leftNode; ,,,public HTreeNode rightNode; ,,,public int 体重; ,,,//,前序遍历 ,,,public void 预订(){ ,,,,,,,System.out.println(这个); ,,,,,,,如果(this.leftNode !=, null), this.leftNode.preOrder (); ,,,,,,,如果(this.rightNode !=, null), this.rightNode.preOrder (); ,,,} ,,,//,设置左右子节点 ,,,public void setLeftNode (HTreeNode 节点){ ,,,,,,,this.leftNode =,节点; ,,,} ,,,public void setRightNode (HTreeNode 节点){ ,,,,,,,this.rightNode =,节点; ,,,} ,,,//构造方法和toString () ,,,public HTreeNode (int 重量){ ,,,,,,,this.weight =,重量; ,,,} ,,,public String toString () { ,,,,,,,return “节点{重量:,“+重量+“}”; ,,,} ,,,//根据权值对结点进行排序//,,,,public int compareTo (Object obj) {//,,,,,,,,return this.weight 作用;.weight ((HTreeNode) (obj));//,,,,} ,,,public int compareTo (HTreeNode 节点){ ,,,,,,,return this.weight 作用;node.weight; ,,,} }Java数据结构之实现哈夫曼树的示例分析