首页 > 代码库 > 哈夫曼二叉树

哈夫曼二叉树

技术分享

技术分享

    技术分享

    技术分享

     技术分享

     技术分享

      技术分享

     技术分享

      然后是排序的的方法:

      技术分享

     

技术分享
package 哈夫曼二叉树820;/** * 节点中的数据域,一个字符,一个数字; * @author Administrator * */public class Data {    private String c;//字符;    private int number;//字符出现的次数;        public Data(String c,int number){//构造方法        this.c=c;        this.number=number;    }    public Data(){//构造方法            }    public String getC() {        return c;    }    public void setC(String c) {        this.c = c;    }    public int getNumber() {        return number;    }    public void setNumber(int number) {        this.number = number;    }    }
Data
技术分享
package 哈夫曼二叉树820;/** * 一个节点类,每一个节点都有左节点,右节点,以及数据域; * @author YuanMo; * */public class Node {    private Data data;//数据域,数据域内存放两个数据,所以定义一个类来表示;    public Node left;//左子节点;    public Node  right;//右子节点;        /**     * 重写构造方法;data在构造方法中取得;     */    public Node(Data data){        this.data =http://www.mamicode.com/ data;    }    /**     * 因为定义Data的是private型,所以实现Data的set和get方法;     */    public Data getData() {        return data;    }    public void setData(Data data) {        this.data =http://www.mamicode.com/ data;    }                }
Node
技术分享
package 哈夫曼二叉树820;public class HFMTree {    /**     * 创建哈夫曼数;     * @param left哈夫曼树的左子节点;     * @param right哈夫曼熟的右子节点     * @return     */    public Node creatHFMTree(Node left, Node right) {        Data data = new Data();        String c = left.getData().getC() + right.getData().getC();// 得到新的字符c;        int number = left.getData().getNumber() + right.getData().getNumber();// 得到新的number;        data.setC(c);// 把c给新的data        data.setNumber(number);// 把number给新的data        Node fathernode = new Node(data);// 根据data数据域创建父节点;        fathernode.left = left;// 把left设为父节点的左子节点        fathernode.right = right;// 把left设为父节点的右子节点        return fathernode;// 把父节点传回去;    }    /**     * 打印哈夫曼树; 采用前序遍历;     * @param node要打印的当前的节点;     */    public void printHFMTree(Node node) {        if (node != null) {        String c=    node.getData().getC();        int number=node.getData().getNumber();            System.out.print("" + "字符:" + c + "    频率:" + number);            System.out.println();            if (node.left != null) {// 当不为空时,递归调用该方法输出;                printHFMTree(node.left);            }            if (node.right != null) {// 当不为空时,递归调用该方法输出;                printHFMTree(node.right);            }        }    }}
HFMTree
技术分享
package 哈夫曼二叉树820;import java.util.ArrayList;public class CreatHFMTree {    public static void main(String[] args) {        ArrayList<Node> list = new ArrayList<Node>();// 实例化一个数组队列进行存储数据;        list.add(new Node(new Data("b", 3)));        list.add(new Node(new Data("c", 7)));        list.add(new Node(new Data("d", 10)));        list.add(new Node(new Data("a", 15)));        // 实例化一个哈夫曼树对象;        HFMTree hfm = new HFMTree();        // 根据list数组队列中的节点去创建哈夫曼;        for (int i = 0; i < list.size(); i++) {            sort(list);// 对数组队列进行排序;            /*因为每取一次,我们就删除,而删除之后数组队列的数改变了,也就是形成了一个新的数组             *     所以我们需要从头开始找,也就是从新的数组的第一个数开始;    */            i = 0;            Node left = list.get(i);// 得到左子节点;            list.remove(i);// 在数组队列中删除该节点            Node right = list.get(i);// 得到右子节点;            list.remove(i);// 在数组队列中删除该节点                        Node father = hfm.creatHFMTree(left, right);// 得到父节点;            list.add(father);// 把父节点添加到数组中;        }        Node root = list.get(0);// 获取根节点;        hfm.printHFMTree(root);    }    /**     * 将数组队列进行排序;采用了冒泡排序法;     * @param list   要进行排序的数组队列;     */    public static void sort(ArrayList<Node> list) {        for (int j = 0; j < list.size(); j++) {            for (int i = 0; i < list.size() - 1; i++) {                Node c = list.get(i);                int z = i;                z++;                Node x = list.get(z);                if (c.getData().getNumber() > x.getData().getNumber()) {                    list.remove(i);                    list.add(i, x);                    list.remove(z);                    list.add(z, c);                }            }        }    }}
CreatHFMTree

 

哈夫曼二叉树