题解 | #【模板】哈夫曼编码#

【模板】哈夫曼编码

https://www.nowcoder.com/practice/4c0419eb07c840ca8402e4f2a52cfd49

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.PriorityQueue;
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    static long minLen;
    public static class TreeNode {
        long count;
        TreeNode left;
        TreeNode right;

        public TreeNode(long count, TreeNode left, TreeNode right) {
            this.count = count;
            this.left = left;
            this.right = right;
        }
    }
    //构建哈夫曼树
    public static TreeNode buildHuffmanTree(PriorityQueue<TreeNode> queue) {
        TreeNode root1, root2;
        while (queue.size() > 1) {
            root1 = queue.remove();
            root2 = queue.remove();
            queue.add(new TreeNode(root1.count + root2.count, root1, root2));
        }
        return queue.remove();
    }

    //遍历赫夫曼树获取所有叶子节点的赫夫曼编码长度
    public static void calLen(TreeNode root, int len) {
        //递归实现
        if (root.left == null && root.right == null) {
            minLen += len * root.count;
            return;
        }
        //完全二叉树
        assert root.left != null;
        calLen(root.left, len + 1);
        calLen(root.right, len + 1);
    }
    public static StreamTokenizer myReader() {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        return new StreamTokenizer(br);
    }

    public static void main(String[] args) throws IOException,ArithmeticException {
        StreamTokenizer st = myReader();
        st.nextToken();
        int n = (int)st.nval;
        PriorityQueue<TreeNode> queue = new PriorityQueue<>(n, (a,
                b)-> Math.toIntExact((a.count - b.count)%1000000007));
        for (int i = 0 ; i < n; i++) {
            st.nextToken();
            long count = (int)st.nval;
            queue.add(new TreeNode(count, null, null));
        }
        TreeNode root = buildHuffmanTree(queue);
        calLen(root, 0);
        System.out.println(minLen);
    }
}

全部评论

相关推荐

有没有经济学家能告诉我,三年后中国的就业市场会不会好转?我在校招中拿到了一份9k+的offer,还是行业的龙头企业,心里其实不想再考研了。但又总是担心,万一读研后薪资更高,我会不会后悔呢?
Fyhyuky:三年后肯定不会啊,只会比现在更烂,你自己看看现在有没有什么增长点,电车都是国家补贴兜底才发展出来的,已经比较违背市场自然规律了,互联网更不用说了,国家强力打压,传统制造业转型失败,现在苟延残喘中
点赞 评论 收藏
分享
joe2333:怀念以前大家拿华为当保底的日子
点赞 评论 收藏
分享
喜欢走神的孤勇者练习时长两年半:爱华,信华,等华,黑华
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务