求哈夫曼树中所有结点的权值代码

不只有叶子结点,是所有结点,输入一个有n个叶子结点权值构造的哈夫曼树,输出每一个结点的权值。

参考一下:https://blog.csdn.net/wardseptember/article/details/80717653

如果对你有帮助,可以点击我这个回答右上方的【采纳】按钮,给我个采纳吗,谢谢
 

public class Node implements Comparable<Node> {
    int weight;
    Node lChild;
    Node rChild;
    Object value;
    Object key;

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

    public Node(int weight, Node lChild, Node rChild) {
        this.weight = weight;
        this.lChild = lChild;
        this.rChild = rChild;
    }

    @Override
    public int compareTo(Node o) {
        return new Integer(this.weight).compareTo(new Integer(o.weight));
    }

    @Override
    public String toString() {
        return "Node [weight=" + weight + ", lChild=" + lChild + ", rChild=" + rChild + ", value=" + value + ", key="
                + key + "]";
    }

}

 

public class HuffmanTreeUtil {
    
    //构建哈夫曼树
    public static Node createHuffman(int[] weights) {
        //优先队列,用于辅助构建哈夫曼树
        Queue<Node> nodeQueue = new PriorityQueue<>();
        Node[] nodes = new Node[weights.length];
        //构建森林,初始化nodes数组
        for(int i=0; i<weights.length; i++){
            nodes[i] = new Node(weights[i]);
            nodeQueue.add(nodes[i]);
        }
        //主循环,当结点队列只剩一个结点时结束
        while (nodeQueue.size() > 1) {
            //从结点队列选择权值最小的两个结点
            Node left = nodeQueue.poll();
            Node right = nodeQueue.poll();                
            //创建新结点作为两结点的父节点
            Node parent = new Node(left.weight + right.weight, left, right);
            nodeQueue.add(parent);
        }
        return nodeQueue.poll();
    }
}

 

 public static void main(String[] args) {
        int[] weights = {2,3,7,9,18,25};
        Node tree = HuffmanTreeUtil.createHuffman(weights);
        System.err.println(tree);
        
    }

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^