Java数据结构之实现哈夫曼树的示例分析

  介绍

这篇文章主要介绍了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};

癑ava数据结构之实现哈夫曼树的示例分析"

取出权值最小的两个结点3,7组成一棵二叉树,根节点是权值为10的结点;

癑ava数据结构之实现哈夫曼树的示例分析"

在原序列中去除步骤2中已经被使用了的3和7,并把新的结点权值10加入到序列中并重新排的序,得到{8、10、13};

癑ava数据结构之实现哈夫曼树的示例分析"

再次取出权值最小的两个节点8、10组成一棵根节点为18的二叉树,然后我们去除序列中的8日,10日将18添加到序列中并排序,得到了{13日18};

癑ava数据结构之实现哈夫曼树的示例分析"

将序列{13日18}取出构成一棵新的二叉树,权值为31日此时序列中只剩下了这31个结点,他是这个哈夫曼树的根节点;

癑ava数据结构之实现哈夫曼树的示例分析"

至此,{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数据结构之实现哈夫曼树的示例分析