`
lindingyu
  • 浏览: 29057 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
文章分类
社区版块
存档分类
最新评论

哈弗曼树的创建

阅读更多

First~~~~
  //树的节点类
public class NodeTree {
     public NodeTree left;
     public NodeTree right;
     public NodeTree parents;
     public NodeData data;
    
     //用构造器直接传入数据
     public NodeTree(NodeData data){
    this.data = data;
     }
}


Second~~~~
//数据类

public class NodeData {
public char s;
public int weight;
}


Third~~~~~
//哈弗曼树的建立
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class TreeHFM {
   
   //创建HFM树,并返回根节点
    public NodeTree creatHFM(List<NodeTree> node){
NodeTree tem = null;
//1排序 2更新队列 3算法
while(!(node.size()<2)){
sort(node);//队列排序  从小到大
NodeTree a1 = node.remove(0);//取得最小的两个元素
NodeTree a2 = node.remove(0);
//建树
NodeData da = new NodeData();//节点对象的数据
da.weight = a1.data.weight+a2.data.weight;
NodeTree root = new NodeTree(da);//创建节点对象
root.left = a1;
root.right = a2;
a1.parents = root;
a2.parents = root;
node.add(root);//将节点放入队列
tem=root;
          }
return tem;
}

//排序     从小到大  冒泡
  public void sort(List<NodeTree> node){

for(int i=0;i<node.size();i++){
NodeTree i1 = node.get(i);
   for(int j=i+1;j<node.size();j++){
NodeTree j1 = node.get(j);
if(i1.data.weight > j1.data.weight){//如果i1小于j1,则交换
   NodeTree temp = node.get(i);
   node.set(i, node.get(j));
   node.set(j, temp);
      }
    }
           }
}
   //获得哈弗曼编码  返回   数据NodeData 与 编码String  形成映射的Map
   public Map<NodeData,String>  creatCode(NodeTree root,String code){
java.util.Map<NodeData,String> ma = new java.util.HashMap<NodeData,String>();

         if(root.left!=null){//根节点的左子树不为空,+1 到码表中

  ma.putAll(creatCode(root.left,code+"1"));

}

if(root.right!=null){//根节点的右子树不为空,+0到码表中
  ma.putAll(creatCode(root.right,code+"0"));

}

if((root.right==null)&&(root.left==null)){//如果是叶子节点,返回码表
  ma.put(root.data, code);
}

return ma;
}



//遍历打印树  格式  (char)a   011
public void printHFM(NodeTree root){//,Map<NodeData,String> ma

   if(root!=null){//先序排列
       System.out.println(root.data.weight); 
              
               NodeTree left = root.left;  
      printHFM(left);   

      NodeTree right = root.right;   
      printHFM(right);   
   }
}

//生成一个模拟数据     返回 存放树节点的队列
public List<NodeTree> datacreat(){
List<NodeTree> node = new ArrayList<NodeTree>();
for(int i=0;i<10;i++){
NodeData da = new NodeData();
da.s = (char)(97+i);
da.weight = (10-i)*2;
NodeTree no = new NodeTree(da);
node.add(no);
}
return node;
}


public static void main(String[] args) {
TreeHFM tr = new TreeHFM();

List<NodeTree> node = tr.datacreat();

NodeTree root = tr.creatHFM(node);
tr.printHFM(root);

//遍历码表
String code = "";
java.util.Map<NodeData,String> ma = tr.creatCode(root, code);
java.util.Set<NodeData> se = ma.keySet();
java.util.Iterator<NodeData> it = se.iterator();

while(it.hasNext()){
NodeData no = it.next();
String code1 = ma.get(no);
System.out.println("字节是:"+no.s + "    weight是:"+no.weight +"码表为:"+code1);
}

分享到:
评论

相关推荐

    哈弗曼树及编码 C语言实现

    在C语言下实现哈弗曼树的创建并进行哈弗曼编码,同时输出哈弗曼编码。

    哈弗曼树的建立 C++代码

    ### 哈弗曼树(Huffman Tree)的构建与C++实现 #### 知识点一:哈弗曼树的基本概念 哈弗曼树,又称最优二叉树,是一种带权路径长度最短的二叉树,在数据压缩、编码等领域有广泛应用。哈弗曼树的构建基于贪心算法...

    哈弗曼树的代码

    哈弗曼树哈弗曼树哈弗曼树哈弗曼树哈弗曼树哈弗曼树哈弗曼树哈弗曼树哈弗曼树

    哈弗曼编码器 并以直观方式显示哈弗曼树

    - `HuffmanCode`类型用于存储编码表,`HuffmanCoding`函数用于基于哈弗曼树创建编码表。 - `Encoding`函数用于根据编码表对文本进行编码。 #### 程序模块设计 实验报告中的程序模块设计包括初始化、编码、译码、...

    关于哈弗曼树的一个算法

    在ALGO6-1.c这个C语言程序中,很可能实现的就是上述哈弗曼树的构建过程,包括节点的创建、优先队列的管理以及哈弗曼树的生成。1.jpg、2.jpg和3.jpg可能包含的是哈弗曼树的可视化示例,帮助理解哈弗曼树的构造结果...

    哈弗曼树进行压缩编码

    2. **创建哈弗曼树**:基于这些频率,构建哈弗曼树。通常采用贪心算法,通过不断地合并频率最小的两个节点来构建。这个过程直到只剩下一个节点,即形成了哈弗曼树的根节点。 3. **生成编码**:从哈弗曼树的根节点...

    哈弗曼树C++源代码

    哈弗曼树(Huffman Tree),也称为最优二叉树,是一种特殊的二叉树,用于数据编码和解码,尤其在数据压缩领域有着广泛应用。它是由哈弗曼在1952年提出的一种构建方法,旨在最小化带权路径长度(WPL),即树中所有...

    C++哈弗曼树

    为了测试程序的正确性,你可以创建一个简单的输入数据集,如几个不同的权值,然后验证生成的哈弗曼树是否符合预期,并检查哈弗曼编码是否正确。 在压缩文件“哈弗曼树”中,可能包含了具体的C++代码实现、测试数据...

    哈弗曼树及哈弗曼编码的创建

    ### 哈弗曼树及哈弗曼编码的创建 #### 一、哈弗曼树的概念与构建 哈弗曼树(Huffman Tree),又称最优二叉树,是一种带权路径长度最短的二叉树,具有广泛的应用,特别是在数据压缩领域。其构造方法为:对给定的一...

    哈弗曼树的建立及哈弗曼编码的生成 c++实现

    代码可能包括创建`HuffmanNode`类,实现最小堆的管理,以及哈弗曼树的构建和编码功能。`www.pudn.com.txt`可能是示例输入文件,用于测试程序的正确性,包含待编码的字符及其频率。 理解并实现哈弗曼树和哈弗曼编码...

    数据结构之哈弗曼树实现压缩

    哈弗曼树(Huffman Tree),也称为最优二叉树,是数据结构中的一种特殊树形结构,主要用于数据编码和解码,特别是用于数据压缩。它通过构建一棵权值最小的二叉树来达到最高效的编码效果。在哈弗曼树中,频率较高的...

    C++哈弗曼树!哈弗曼树

    哈弗曼树,又称最优二叉树或最小带权路径长度树,是数据结构领域中的一个重要概念,尤其在数据编码和压缩中有着广泛的应用。它是一种特殊的二叉树,其特性是任何节点的两个子节点都是空节点或者权值较小的节点在左,...

    数据结构哈弗曼树课程设计

    2. **创建单节点树**:将每个字符视为一个单独的哈弗曼树,即只有一个节点的树,频率作为节点的权重。 3. **合并最小树**:选取两个频率最小的树进行合并,形成一个新的哈弗曼树,新树的频率为两棵树的频率之和,新...

    用C语言实现哈弗曼树(数据结构课程设计)

    - 实现哈弗曼树节点的创建、插入、删除等操作。 - 使用优先队列(最小堆)处理节点合并。 - 编写编码和解码函数,包括编码表的生成、文件的读写操作。 7. **性能优化** - 使用动态内存分配,避免一次性加载大量...

    C++实现哈弗曼树的建立

    ### C++ 实现哈夫曼树的建立 #### 概述 哈夫曼树(Huffman Tree),又称最优二叉树,是一种带权路径长度最短的二叉树,在数据压缩编码、文件系统等方面有着广泛的应用。本文将详细介绍如何利用 C++ 来实现哈夫曼树...

    基于哈弗曼树的字符统计

    哈弗曼树(Huffman Tree)是一种特殊的二叉树,常用于数据编码,特别是在字符压缩和统计中。在这个项目中,“基于哈弗曼树的字符统计”是一个实际应用的数据结构示例,它使用哈弗曼编码技术来分析文本中的字符频率,...

    哈弗曼树的生成(编码)

    哈弗曼树,又称霍夫曼树,是一种特殊的二叉树,主要用于数据的高效编码,尤其是在数据压缩领域有着广泛的应用。这种树结构的特点是:树中任一节点的两个子节点都是子树中权值最小的两个节点。权值在这里通常代表字符...

    用C++语言写的关于用哈弗曼树编码问题的程序

    2. **构建哈弗曼树**:根据字符频率,创建最小带权路径长度(WPL)的二叉树。初始时,每个字符是一个单独的节点,然后通过合并频率最低的两个节点,不断构建新的节点,直到所有节点构成一棵树。 3. **生成编码**:从...

    哈弗曼树及其图形化

    哈弗曼树(Huffman Tree),也称为最优二叉树,是数据压缩和编码领域中的一个重要概念。它是由美国计算机科学家David Huffman在1952年提出的,主要用于构造哈弗曼编码,这是一种高效的前缀编码方式。哈弗曼树通过...

    哈弗曼树的创建、生成哈弗曼编码 权威

    创建哈弗曼树的过程通常包括以下几个步骤: 1. **构建哈弗曼树的准备**:首先,我们需要收集所有需要编码的字符及其对应的频率(权重)。这些信息可以来自于文本或其他数据源。权重表示字符出现的次数或重要性,越...

Global site tag (gtag.js) - Google Analytics