Day578.霍夫曼树 -数据结构和算法Java

Posted 阿昌喜欢吃黄桃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day578.霍夫曼树 -数据结构和算法Java相关的知识,希望对你有一定的参考价值。

霍夫曼树

一、介绍

二、重要概念

三、图解思路


四、代码实现

package com.achang.tree;

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

/**
 * 霍夫曼数
 */
public class HufumanTree 
    public static void main(String[] args) 
        int[] arr = 13, 7, 8, 3, 29, 6, 1;
        Node2 hufuManTree = buildHufuManTree(arr);

        hufuManTree.preList();//遍历查看结果
    

    //构建霍夫曼数
    public static Node2 buildHufuManTree(int[] arr) 
        //排序数组并构建成以Node为元素的List集合
        List<Node2> list = buildListSort(arr);
        System.out.println("未处理:"+list);

        while (list.size() != 1)
            //取出根节点权值最小的两颗二叉树
            Node2 leftNode = list.get(0);
            //取出根节点权值第二小的两颗二叉树
            Node2 rightNode = list.get(1);

            //构建新的二叉树
            Node2 parent = new Node2(rightNode.value + leftNode.value);
            parent.left = leftNode;
            parent.right = rightNode;
            list.add(parent);

            //干掉原来的rightNode和leftNode
            list.remove(leftNode);
            list.remove(rightNode);
            Collections.sort(list);
//            System.out.println("第一次处理后:"+list);
        
        System.out.println("处理结束:"+list);
        return list.get(0);
    

    //构建list并排序
    private static List<Node2> buildListSort(int[] arr) 
        ArrayList<Node2> list = new ArrayList<>();
        for (int i : arr) 
            list.add(new Node2(i));
        
        Collections.sort(list);
        return list;
    


/**
 * 节点
 */
class Node2 implements Comparable<Node2> 
    public Node2 left;//左子节点
    public Node2 right;//右子节点
    public int value;//权值

    public Node2(int value) 
        this.value = value;
    

    @Override
    public String toString() 
        return "Node2[value=" + value + "]";
    

    @Override
    public int compareTo(Node2 o) 
        //从小到大排序
        return this.value - o.value;
    

    //前序遍历
    public void preList()
        System.out.println(this);//先输出父节点
        //递归向左前序遍历
        if (this.left != null) 
            this.left.preList();
        
        //递归向右前序遍历
        if (this.right != null) 
            this.right.preList();
        
    


以上是关于Day578.霍夫曼树 -数据结构和算法Java的主要内容,如果未能解决你的问题,请参考以下文章

Day10 树---哈夫曼树 家谱处理 搜索树判断 目录树

Day10 树---哈夫曼树 家谱处理 搜索树判断 目录树

整理打卡

SSL 1407哈夫曼树哈夫曼树(哈夫曼树知识)

霍夫曼树

霍夫曼树