霍夫曼编码树的一些介绍


在这里插入图片描述
节点上的值就是权值。

构建一个赫夫曼树的核心就是需要将权值大的值,接近根节点,介绍路径。
说白了就是影响力大的地方军阀,一定要防放在自己身边,不能让这些人远离自己搞小动作,不然不知道他们背着自己搞什么小动作。


在这里插入图片描述
构建霍夫曼树,先进行排序。然后取出最小值,去建立一个二叉树,这个二叉树的根节点就是两个叶子节点的值得和。
在这里插入图片描述

然后再拿一个比较小的节点出来,和已经做好的树进行组合,再次捣鼓出来一个树。
然后根据合并之后根节点,去比较,然后创造新的二叉树
在这里插入图片描述
在这里插入图片描述
说白了就是,每次取出来最小的两个值,做成一个二叉树,新的二叉树的根节点,去和没被处理的节点进行排序,
比如 2,5,6,11,15
2,4,组成一个二叉树,根节点是7
那么这回轮到
7,6,11,15四个进行排序了
6,7,11,15
排序后,是6,7两个值组成一个二叉树
根节点13,13去和剩下的11,15进行排序,排序后
再次重复上面步骤
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

就是这么一个东西。

在这里插入图片描述
在这里插入图片描述

package org.example.sort;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class MergeSort {
    private static List<Integer> list = new ArrayList<>();//用来存储所有重复的数字,的下标

    public static void main(String[] args) {
        int[] arr = {1,6,2,334,66,11,3};
        //将所有数据都整编成为节点
        List<HeroNode> list = new ArrayList<>();

        for(int ar : arr){

            HeroNode heroNode = new HeroNode();
            heroNode.setNo(ar);
            list.add(heroNode);

        }
        //将所有
        Collections.sort(list);//在链表里,所有Node都实现了comporbale接口,所以可以进行排序

        for(HeroNode node : list){
            System.out.println(node);
        }


        //霍夫曼树,在List中排序好节点,然后每次拿出来前两个节点,然后组成一棵树,再把这棵树根节点存进List中去
        //然后排序,排序后,再拿出来两个最小节点//也就是前两个,然后组成一棵树,再存一下树
        //别忘了,两个节点组成树之后,将这两个节点删除
        while(list.size() > 1){
            //当里面有很多个节点时候
            //循环终止条件是里面只有一个节点了
            HeroNode heroNode = list.get(0);

            HeroNode heroNode1 = list.get(1);//取出最小的两个
            HeroNode newNode = new HeroNode(heroNode1.no + heroNode.no, heroNode1, heroNode);

            list.add(newNode);
            list.remove(heroNode);
            list.remove(heroNode1);//移除
            Collections.sort(list);//重新排序

        }

       






    }






}

创建赫夫曼树的代码。

package org.example.sort;

public class HeroNode implements Comparable<HeroNode> {
    //实现这个接口之后,可以按照你想要方式进行排序
    public  int no;

    public  HeroNode left;
    public  HeroNode right;

    public HeroNode(int no, HeroNode left, HeroNode right) {
        this.no = no;
        this.left = left;
        this.right = right;
    }

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public HeroNode getLeft() {
        return left;
    }

    public void setLeft(HeroNode left) {
        this.left = left;
    }

    public HeroNode getRight() {
        return right;
    }

    public void setRight(HeroNode right) {
        this.right = right;
    }

    @Override
    public String toString() {
        return "HeroNode{" +
                "no=" + no +
                ", left=" + left +
                ", right=" + right +
                '}';
    }

    public HeroNode() {
    }

    @Override
    public int compareTo(HeroNode o) {
        //让No以你想要方式进行排序
        return this.no - o.no;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值