霍夫曼树(最优二叉树)的实现

本文介绍了霍夫曼树的基本概念,包括节点的路径和路径长度、带权路径长度以及树的带权路径长度。详细阐述了霍夫曼树的构建步骤,并通过实例进行图解展示,最后给出了霍夫曼树的Java代码实现。
摘要由CSDN通过智能技术生成

一、相关概念

1.节点的路径及路径长度

路径:在树中,一个节点向下到达另一个节点的通路,称为路径。
路径长度:路径中经历的分支数。
在这里插入图片描述
图中节点1到节点4的路径就是:1->2,2->4。路径长度为2。

2.节点的带权路径长度

在树中,可以定义某个节点的权值,从根节点到此节点的路径长度与此节点的权值的乘积就是该节点的带权路径长度。
例如:上图中若定义节点4的权值为4,则其带权路径长度为4*2=8。

3.树的带权路径长度

树中所有叶子节点的带权路径之和称为树的带权路径长度,简称WPL(weighted path length)。

4.霍夫曼树

拥有相同叶子节点的所有树中,WPL最小的树称为霍夫曼树,又称最优二叉树。
在这里插入图片描述
上图中右面的就为霍夫曼树(未画出所有情况)。

二、构建步骤与图解

1.构建步骤

目标:给定一个数列arr,其中元素对应叶子节点的权值,以此构建霍夫曼树。

  1. 将数列中各元素看成只有根节点的树,按权值对各树从小到大排序。
  2. 以其中最小的两颗树为左右子树构建成一颗新的树t,t的权值为两子树权值之和。
  3. 在数列中用t取代其左右子树,再对剩下的树按权值进行排序,并循环1,2步骤。
  4. 直到数列中只剩下一个元素,霍夫曼树就构建成了。

2.图解

以arr={2,3,4,12,7,6}为例。

1.排序{2,3,4,6,7,12},并取出前两个。
在这里插入图片描述
2.变为{4,6,7,12,5},排序{4,5,6,7,12},取出前两个。
在这里插入图片描述
3.变为{6,7,12,9},排序{6,7,9,12},取出前两个。
在这里插入图片描述
4.变为{9,12,13},取出前两个。
在这里插入图片描述
4.变为{13,21},取出前两个。
在这里插入图片描述

5.4.变为{34},结束。

三、代码实现

1.创建节点类:

class Node implements Comparable<Node> {
   
    int value;
    Node left;
    Node right;

    public Node(int value) {
   
        this.value = value;
    }

    @Override
    public String toString() {
   
        return "Node{" +
                "value=" + value +
                '}';
    
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值