用java写。已知四个带权的结点:(A,1),(B,2),(C,2),(D,3),构造Huffman数,并给出每个结点的编码。

跪求!... 跪求! 展开
 我来答
chenguang5092
推荐于2016-07-14 · TA获得超过664个赞
知道小有建树答主
回答量:520
采纳率:50%
帮助的人:459万
展开全部
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Huffman {

    public static void main(String[] args) {

        Huffman huff = new Huffman();
        //准备数据
        Node node_a = new Node("A", 1);
        Node node_b = new Node("B", 2);
        Node node_c = new Node("C", 2);
        Node node_d = new Node("D", 3);
        ArrayList<Node> list = new ArrayList<Node>();
        list.add(node_a);
        list.add(node_b);
        list.add(node_c);
        list.add(node_d);
        //建树
        huff.build(list);
        //根
        Node root = list.get(0);
        //编码
        huff.setHuffmanCode(root);
        //
        System.out.println(node_a.getName()+":"+node_a.huffmanCodeString);
        System.out.println(node_b.getName()+":"+node_b.huffmanCodeString);
        System.out.println(node_c.getName()+":"+node_c.huffmanCodeString);
        System.out.println(node_d.getName()+":"+node_d.huffmanCodeString);
    }

    private void setHuffmanCode(Node huff) {
        Node left = huff.getNodeLeft();
        // 左节点追加"0"
        if (left != null) {
            left.huffmanCodeString = huff.huffmanCodeString + "0";
            setHuffmanCode(left); 

        }
        Node right = huff.getNodeRight();
        // 右节点追加"1"
        if (right != null) {
            right.huffmanCodeString = huff.huffmanCodeString + "1";
            setHuffmanCode(right); 
        }
    }

    public void build(List<Node> list) {
        // 按权值从小到大排序
        if (list.size() > 2)
            Collections.sort(list, new Comparator<Node>() {
                @Override
                public int compare(Node o1, Node o2) {
                    return o1.getWeight() - o2.getWeight();
                }
            });
        //移除最小的2个
        Node l = list.get(0);
        Node r = list.get(1);
        list.remove(l);
        list.remove(r);
        
        //生成一个新的,并设置左右子节点
        Node newNode = new Node(l.getName() + r.getName(), l.getWeight()    + r.getWeight());
        newNode.setNodeLeft(l);
        newNode.setNodeRight(r);
        
        if (list.isEmpty()) {// 根节点
            list.add(newNode);
            return;
        } else {
            list.add(newNode);
            build(list);
        }
    }

}

class Node {
    //存储编码
    public String huffmanCodeString = "";
    
    private String name; // 名称
    private int weight; // 权值
    private Node nodeLeft; // 左节点
    private Node nodeRight;// 右节点

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }

    public Node getNodeLeft() {
        return nodeLeft;
    }

    public void setNodeLeft(Node nodeLeft) {
        this.nodeLeft = nodeLeft;
    }

    public Node getNodeRight() {
        return nodeRight;
    }

    public void setNodeRight(Node nodeRight) {
        this.nodeRight = nodeRight;
    }

}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式