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

来源:学生作业帮助网 编辑:作业帮 时间:2024/04/29 04:19:15
用java写.已知四个带权的结点:(A,1),(B,2),(C,2),(D,3),构造Huffman数,并给出每个结点的编码.

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

用java写.已知四个带权的结点:(A,1),(B,2),(C,2),(D,3),构造Huffman数,并给出每个结点的编码.
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;
    }

}

用java写.已知四个带权的结点:(A,1),(B,2),(C,2),(D,3),构造Huffman数,并给出每个结点的编码. 6、求java算法 已知四个带权的结点:(A,1),(B,2),(C,2),(D,3),构造Huffman数,并给出每个结点的编码. 已知带表头结点的单链表L,指针P指向L链表中的一个结点(非首、尾结点):删除P结点的语句序列是? 已知带头结点的单链表L中的结点按整数值递增排列,写一算法,将x结点插入L中,使L仍然有序 已知L是无表头的单链表,其P结点既不是首元结点,也不是尾元结点,a.在p结点后插入s结点的语句序列是---------------- b.在p结点前插入s结点的语句序列是---------------- c.在表首插入s结点的语句序 已知L是带表头结点的非空单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适删除P结点的直接前驱结点的语句序列是_ (10) (12) (8) (3) (14).(3) P->next=P 用Java写, 数据结构:在带头结点的単链接head中,已知指针e指向链表的某个结点,写一个算法求该结点的直接前趋结点! 电路结点的判断,a和b为什么不算结点 带数字的词语,写四个. 写四个带静字的近义词 数据结构中的一道题由权值为9,2,5,7的四个叶子结点构造一棵哈夫曼树,该树的带权路径长度为__(50)__.供选择的答案:A.23 B.37 C.44 D.46 已知一个不带头结点也无头指针并且大于1的循环列表,试写一算法,删除P所指的链结点的直接前驱的结点用C语言数据结构算法写一个程序. 已知带表头结点的非空单链表L,指针P指向L链表中的一个结点(非首尾结点),试从下列选项中选择合适的语句序列1,删除P节点的直接后继结点的语句是()2.删除P节点的直接前驱结点的语句是( 用结点电压法求解a、b的电压 有七个带权结点,其权值分别为3,7,8,2,6,10,14,试以它们为叶结点构造一棵哈夫曼树(请按照每个结点的左子树根结点的权小于等于右子树根结点的权的次序构造),并计算出带权路径长度WPL及该 java 输出100--200间不能被3整除的数怎么写 用java 《数据结构》用广义表的带表头结点的存储表示法表示下列集合 A = ( ) B = (6, 2)C = (‘a’,( 5, 3,用广义表的带表头结点的存储表示法表示下列集合. A = ( ) B = (6, 2)C = (‘a’,( 5, 3, ‘x’))D = (