数据结构和算法(23)之构建赫夫曼树

学习数据结构和算法的日常Demo

赫夫曼树基本介绍

在这里插入图片描述

赫夫曼树中的重要概念

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

赫夫曼树构建步骤

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

图解

列表:4,6,7,8,13,29
列表:7,8,10,13,29
在这里插入图片描述
列表:10,13,15,29
在这里插入图片描述
列表:15,23,29
在这里插入图片描述
列表:29,38
在这里插入图片描述
列表:67
在这里插入图片描述

代码实现

// Node需要排序
public class HuffmanNode implements Comparable<HuffmanNode> {
    int value;          // 权值
    HuffmanNode left;   // 左子节点
    HuffmanNode right;  // 右子节点

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

    @Override
    public String toString() {
        return "HuffmanNode{" +
                "value=" + value +
                '}';
    }


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

    // 前序遍历
    public void preOrder() {
        System.out.print(this.value + " ");
        if (this.left != null) {
            this.left.preOrder();
        }
        if (this.right != null) {
            this.right.preOrder();
        }
    }
}

public class HuffmanTreeDemo {
    public static void main(String args[]) {
        int arr[] = {13, 7, 8, 3, 29, 6, 1};
        Arrays.sort(arr);
        HuffmanNode root = createHuffmanTree(arr);
        System.out.println("前序遍历:");
        root.preOrder();
    }

    public static HuffmanNode createHuffmanTree(int[] arr) {
        ArrayList<HuffmanNode> nodes = new ArrayList<>();
        for (int i : arr) {
            // 每个节点放入集合中
            nodes.add(new HuffmanNode(i));
        }
        // 以下六步骤应为循环
        while (nodes.size() > 1) {
            // 1.取出根节点权值最小的二叉树
            // 单个节点视为小型二叉树
            HuffmanNode leftNode = nodes.get(0);
            // 2.取出第二小的节点
            HuffmanNode rightNode = nodes.get(1);
            // 3.构建新的二叉树
            // 新二叉树权值 = 左 + 右
            HuffmanNode parent = new HuffmanNode(leftNode.value + rightNode.value);
            parent.left = leftNode;
            parent.right = rightNode;
            // 4.构建新二叉树后,删除掉用过的左右小树
            nodes.remove(leftNode);
            nodes.remove(rightNode);
            // 5.将新树加入进集合
            nodes.add(parent);
            // 6.根据权值重新排序
            Collections.sort(nodes);
        }
        // 返回赫夫曼树的头结点
        return nodes.get(0);
    }
}

在这里插入图片描述

GitHub:数据结构和算法源代码

发布了67 篇原创文章 · 获赞 21 · 访问量 2683

猜你喜欢

转载自blog.csdn.net/qq_44779506/article/details/105125743
今日推荐