哈夫曼二叉树

    

    

     

     

     

     

      然后是排序的的方法:

     

     

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 = data;
    }
    /**
     * 因为定义Data的是private型,所以实现Data的set和get方法;
     */
    public Data getData() {
        return data;
    }
    public void setData(Data data) {
        this.data = 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

时间: 2025-02-01 11:56:36

哈夫曼二叉树的相关文章

利用哈夫曼二叉树实现文件的压缩

首先,我们需要了解一下我们平时的文件是如何保存的.不难理解:不管是什么类型的文件都是以字节的形式存储在我们的各种储存器中的,以二进制的方式将数据储存起来.而我们需要找到一种能够占用内存更少的方式将我们的数据储存.下面我将以压缩字符串为例仔细探讨如何利用哈夫曼二叉树(最优二叉树)压缩文件. 首先需要一个字符串,String str=“QQAFDGGFDAAGFGFDHGFHG”;然后我们需要对每一个字符进行哈夫曼编码,即找到每一个出现的字符找个属于它的哈夫曼编码,当然这不是随便乱给的.下面来看一下

C# 霍夫曼二叉树压缩算法实现

知道有的人比较懒,直接贴全部代码. 一开始一次性Code完了压缩部分代码.只调试了2,3次就成功了. 一次性写150行代码,没遇到什么bug的感觉还是蛮爽的. 写解压代码,才发现压缩代码有些细节问题. 对最后一个字符处理问题. 遇到比较折腾点:构建二叉树时,把原本应该是(叶结点的有值的)节点放在了左节点,正确应该放在右节点,导致生成的编码序列不满足(任意编码不是其他编码的前缀).导致解码失败. 使用方法: var srcData = Encoding.UTF8.GetBytes(textBox1

一道哈夫曼二叉树题目--稍微容易一点

答案是A,C, 要先画哈夫曼树, 总结一下, 哈夫曼编码树, 和哈夫曼树还是有点区别. 哈夫曼树的左右节点大小好像没关系(视频里听了一句), 编码树都可以左节点要小值. 原文地址:https://www.cnblogs.com/tekikesyo/p/10792452.html

由二叉树构造赫夫曼树

赫夫曼树: 假设有n个权值{w1,w2,w3....},试构造一棵具有n个叶子节点的二叉树,每个叶子节点带权为wi,则其中带权路径长度最小的二叉树称为最优二叉树或者叫赫夫曼树. 构造赫夫曼树: 假设有n个权值,则构造出的赫夫曼树有n个叶子节点,n个权值分别设置为w1,w2,....wn,则赫夫曼树的构造规则为: 1.将w1,w2...看成是有n棵树的森林: 2.在森林中选择两个根节点的权值最小的树合并,作为一棵新树的左右子树,且新树的根节点权值为其左右子树根节点权值之和: 3.从森林中删除选取的

php 二叉树 与赫夫曼树

在学习图之前,中间休息了两天,感觉二叉树需要消化一下.所以中间去温习了下sql,推荐一本工具书<程序员的SQL金典>看名字不像一本好书,但是作为一个不错的SQL工具书还是可以小小备忘一下.涵盖内容不详细但是挺广,覆盖多种主流数据库 言归正传,以前知道折半查找,二叉树的概念也是感觉挺有意思,二叉树的实现有一个案例很不错,代码如下 class BiNode{ public $data; public $lchild; public $rchild; public function __constr

Huffman tree(赫夫曼树、霍夫曼树、哈夫曼树、最优二叉树)

flyfish 2015-8-1 Huffman tree因为翻译不同所以有其他的名字 赫夫曼树.霍夫曼树.哈夫曼树 定义引用自严蔚敏<数据结构> 路径 从树中一个结点到另一个结点之间的分支构成两个结点之间的路径. 路径长度 路径上的分支数目称作路径长度. 树的路径长度 树的路径长度就是从根节点到每一结点的路径长度之和. 结点的带权路径长度 结点的带权路径长度就是从该结点到根节点之间的路径长度与结点上权的乘积. 树的带权路径长度 树的带权路径长度就是树中所有叶子结点的带权路径长度之和,通常记做

数据结构第三部分:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算

参考:浙大数据结构(陈越.何钦铭)课件 1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找——方法一:顺序查找(时间复杂度O(n)) int

数据结构(三):非线性逻辑结构-特殊的二叉树结构:堆、哈夫曼树、二叉搜索树、平衡二叉搜索树、红黑树、线索二叉树

在上一篇数据结构的博文<数据结构(三):非线性逻辑结构-二叉树>中已经对二叉树的概念.遍历等基本的概念和操作进行了介绍.本篇博文主要介绍几个特殊的二叉树,堆.哈夫曼树.二叉搜索树.平衡二叉搜索树.红黑树.线索二叉树,它们在解决实际问题中有着非常重要的应用.本文主要从概念和一些基本操作上进行分类和总结. 一.概念总揽 (1) 堆 堆(heap order)是一种特殊的表,如果将它看做是一颗完全二叉树的层次序列,那么它具有如下的性质:每个节点的值都不大于其孩子的值,或每个节点的值都不小于其孩子的值

构造最优二叉树-赫夫曼(Huffman)树算法

一.基本概念 1.赫夫曼(Huffman)树又称最优二叉树或最优搜索树,是一种带权路径长度最短的二叉树.在许多应用中,常常赋给树中结点一个有某种意义的实数,称此实数为该结点的权.从树根结点到该结点之间的路径长度与该结点上权的乘积称为结点的带权路径长度(WPL),树中所有叶子结点的带权路径长度之和称为该树的带权路径长度,通常记为: 2.两结点间的路径:从一结点到另一结点所经过的结点序列;路径长度:从根结点到相应结点路径上的分支数目;树的路径长度:从根到每一结点的路径长度之和. 3.深度为k,结点数