引子:

用链式结构来建立哈夫曼树。
总体思路是:
将每一棵树(这是每一棵树只有一个节点,头节点)放在一个优先队列中(下面的是链表实现的优先队列),频率(rate)小的在队列头,取出队列头两个,频率相加之后组合成一个有三个节点的树,重新放入优先队列中。重复上面的过程,直到最后只剩下一个,则这最后一个便是哈夫曼树。
编码:从叶子节点开始往上。
解码:从根节点开始往下。
package tree;

import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Map.Entry;import java.util.Set;import java.util.Stack;

/** * 哈夫曼编码解码 * @author LiangYH * */public class HuffmanTest {

   public static void main(String[] args) {      HuffmanTest tree1 = new HuffmanTest();       tree1.setRoot("A", 9);

      HuffmanTest tree2 = new HuffmanTest();       tree2.setRoot("B", 5);

      HuffmanTest tree3 = new HuffmanTest();       tree3.setRoot("C", 8);      HuffmanTest tree4 = new HuffmanTest();       tree4.setRoot("E", 19);     HuffmanTest tree7 = new HuffmanTest();       tree7.setRoot("F", 11);

      MyLink link = new MyLink();      link.add(tree1);      link.add(tree2);      link.add(tree3);      link.add(tree7);      link.add(tree4);      link.printLink();

      HuffmanTest t1 = null;       HuffmanTest t2 = null;       while(link.size() > 1){            t1 = link.delete();          t2 = link.delete();          t2.growTree(t1);          link.add(t2);     }

      t2.printTree();

      Map<String,List<String>> map = t2.getCodeTable();

      t2.printCodeTable(map);

      List<String> list = t2.encode("AEBCF");

      List<String> li2 = t2.decode(list);

      System.out.println();     System.out.print("解码: ");        for(String s: li2){           System.out.print(s);      } }

  private List<Node> leaves = null;  private Map<String, List<String>> codeMap= null;

  private Node root = null;

  public HuffmanTest(){     leaves = new ArrayList<Node>();        codeMap = new HashMap<String, List<String>>();   }

  public Map<String,List<String>> getCodeMap(){     return this.codeMap;  }

  public List<Node> getLeaves(){      getLeaves(root);      return this.leaves;   }

  public void setRoot(String item, int rate){       this.root = new Node(item, rate);    }

  public Node getRoot(){        return this.root; }

  public int getRateOfRoot(){       return this.root.rate;    }

  public void growTree(HuffmanTest newTree){        Node newNode = new Node();       //设置子节点       newNode.leftChild = this.root;       newNode.rightChild = newTree.getRoot();      //设置父节点       this.root.parent = newNode;      newTree.getRoot().parent = newNode;      //设置父节点的权重        newNode.setRate(this.root.rate+newTree.getRateOfRoot());     //重置根节点       this.root = newNode; }

  public void InOrderTraverse(HuffmanTest tree){        traverse(tree.root);

  }

  private void traverse(Node node){     if(node != null){            System.out.print(node.item+"/"+node.rate+"; ");            traverse(node.leftChild);         traverse(node.rightChild);        } }

  //获取叶子节点  private void getLeaves(Node node){        if(node != null){            if(node.item != null){               leaves.add(node);         }         getLeaves(node.leftChild);

          getLeaves(node.rightChild);       } }

   public Map<String,List<String>> getCodeTable(){       //获取叶子节点      getLeaves(root);      int len = leaves.size();     for(int i = 0; i < len; i++){           Node tempNode = leaves.get(i);           List<String> tempList = new ArrayList<String>();

          codeMap.put(tempNode.item, tempList);

          while(tempNode.parent != null){              if(tempNode == tempNode.parent.leftChild){                  tempList.add("0");              }else if(tempNode == tempNode.parent.rightChild){                   tempList.add("1");              }             tempNode = tempNode.parent;          }     }

      return this.codeMap;  }

  public List<String> encode(String target){      System.out.println();     System.out.print(target+" 的编码: ");

      List<String> li = new ArrayList<String>();

      int len = target.length();       for(int i = 0; i < len; i++){           String temp = String.valueOf(target.charAt(i));          List<String> list = codeMap.get(temp);         for(int k = list.size()-1; k >= 0; k--){             System.out.print(list.get(k));                li.add(list.get(k));          }     }     return li;    }

  /**    * 解码  * @param codeList 二进制编码  * @return 解码结果   */   public List<String> decode(List<String> codeList){

      List<String> list = new ArrayList<String>();

      Node tempNode = null;        tempNode = root;     for(String s: codeList){          if("0".equals(s)){              tempNode = tempNode.leftChild;               if(tempNode.item != null){                   list.add(tempNode.item);                  tempNode = root;                 continue;             }         }else if("1".equals(s)){                tempNode = tempNode.rightChild;              if(tempNode.item != null){                   list.add(tempNode.item);                  tempNode = root;                 continue;             }         }     }     return list;  }

  public void printTree(){      InOrderTraverse(this);    }

  public void printCodeTable(Map<String,List<String>> codeTable){       Set<Entry<String,List<String>>> set = codeTable.entrySet();        Iterator<Entry<String,List<String>>> iter = set.iterator();        System.out.println();     while(iter.hasNext()){            Entry<String,List<String>> entry = iter.next();          System.out.print(entry.getKey()+": ");

          List<String> li = entry.getValue();            for(int i = li.size()-1; i >= 0; i--){               System.out.print(li.get(i));

          }         System.out.print("; ");     } }

  class Node{       Node leftChild = null;       Node rightChild = null;      Node parent = null;      //字母      String item = null;      //字母出现的频率     int rate = 0;

      public Node(){

      }     public Node(String item, int rate){           this.item = item;            this.rate = rate;        }

      public void setItem(String item){         this.item = item;        }

      public void setRate(int rate){            this.rate = rate;        }

      public void printNode(){          System.out.println(item+"\\"+rate+"; ");       } }}

/** * 优先链表 * @author LiangYH * */class MyLink{

  private LinkNode first = null;   private int size = 0;

  public MyLink(){

  }

  /**    * 增加节点,并按照相关顺序从小到大排列   * @param tree    */   public void add(HuffmanTest tree){        LinkNode newNode = new LinkNode(tree);

      if(first == null){          first = newNode;         size++;     }else{            boolean isNextNull = false;          LinkNode previous = first;           LinkNode temp = first;           while(tree.getRateOfRoot() > temp.tree.getRateOfRoot()){               if(temp.next == null){                  isNextNull = true;                   break;                }             previous = temp;             temp = temp.next;            }

          //temp所指的是最后一个            if(isNextNull){               temp.next = newNode;             size++;             return;           }         //如果temp指向的是第一个           if(temp == first){              newNode.next = first;                first = newNode;             size++;         }else{                newNode.next = temp;             previous.next = newNode;             size++;         }

      } }

  /**    * 删除最左边的一个元素  * @return    */   public HuffmanTest delete(){      if(isEmpty())         return null;

      LinkNode temp = first;       first = first.next;

      size--;       return temp.tree; }

  public boolean isEmpty(){     return first == null;   }

  public int size(){        return this.size; }

  public void printLink(){      LinkNode temp = first;       while(temp.next != null){            System.out.print(temp.tree.getRoot().item+"\\"+temp.tree.getRateOfRoot()+"; ");            temp = temp.next;        }     System.out.println(temp.tree.getRoot().item+"\\"+temp.tree.getRateOfRoot());  }

  /**    * 内部类     * @author LiangYH    *     */   class LinkNode{       LinkNode next = null;        HuffmanTest tree;

      public LinkNode(HuffmanTest tree){            this.tree = tree;        } }

}

哈夫曼树--链式结构(建立huffman树、编码、解码)相关推荐

  1. 【C】二叉树--顺序结构(详解堆的实现,topK排序、堆排)、和链式结构(链式结构的遍历、链式结构常见递归操作以及练习题)

    本章我们将引入树的概念并详细介绍二叉树.我们会在介绍顺序二叉树基础上,进一步介绍堆以及堆的实现,并以此为依据详解topK排序.堆排等问题:然后我们会介绍链式二叉树的实现以及各种操作.最后,我们也会给出 ...

  2. 二叉树的链式结构的非递归遍历

    二叉树的链式结构的非递归遍历 一. 非递归前序遍历和非递归中序遍历 1.    Stack.h #ifndef__STACK_H__ #define__STACK_H__ #include<st ...

  3. 二叉树的链式结构递归遍历实现

    二叉树的链式结构递归遍历实现 1.     BinTree.h文件 #ifndef__BINTREE_H__ #define__BINTREE_H__ #include<stdio.h> ...

  4. 区块链 - 牵一发而动全身的链式结构

    文章目录 前言 区块的结构 区块如何链接的 反向链接 分叉 如果区块中交易被篡改后 结束语 前言 我们已经深度剖析了工作量证明和梅克尔树这两个典型的哈希应用,这次我们讨论哈希的第三个应用,也是数字货币 ...

  5. 电话号码查询系统(链式结构)

    摘要:C/C++  数据结构 正文:用链式结构来实现电话号码查询系统,程序如下: #include<iostream> #include<malloc.h> #include& ...

  6. C/C++实现栈的链式结构(链栈)

    今天我们学习的是链栈,也就是说栈的链式结构,我们运用顺序链的方式来实现.首先呢,链栈是不存在存储空间满的情况的,所以可以说它是个无底洞,然而我们之前学的顺序栈是有额定空间的. 栈顶指针总是指向栈顶前面 ...

  7. 数据结构(顺序结构、链式结构、索引结构、散列结构)

    文章目录 1.概述 2.数据间逻辑关系 3.数据的存储结构(或物理结构) 3.1顺序结构 3.2链式结构 3.3索引结构 3.4散列结构 4.运算结构 1.概述 数据结构,就是一种程序设计优化的方法论 ...

  8. 二叉树链式结构的实现

    目录 1.二叉树链式结构的实现 1.1前置说明 1.2二叉树的遍历 1.2.1前序.中序以及后序遍历 1.2.2层序遍历 1.3二叉树节点个数及高度等 1.4二叉树的创建和销毁 1.5完全二叉树的判断 ...

  9. 栈之顺序结构和链式结构

    栈的顺序结构实现 typedef int Position; struct SNode {ElementType *Data; /* 存储元素的数组 */Position Top; /* 栈顶指针 * ...

最新文章

  1. typescript用什么软件写_为什么都2019年了大家还喜欢用TypeScript?
  2. linux里查看最耗CPU的线程
  3. asp.net 得到上一页地址
  4. most recent call last 报错_视频|救援情景剧、创意快闪……400w+人次为重庆这场消防宣传活动打call...
  5. 用Visual C#实现文件下载
  6. 谷歌要求华为不启用鸿蒙,谷歌:华为我不让你用我的服务!华为:我还是照样用!...
  7. c++指定在某一线程运行_iPhone11升级iOS14运行速度测试:结果有点小惊喜
  8. 十八、泛型 l 注解 l Servlet3.0 l 动态代理 l 类加载器基础加强
  9. 若泽数据 巨人_面部识别巨人拒绝分享有关其算法数据集的详细信息
  10. sqoop的job工具
  11. HG255D刷机及网络接口配置
  12. delphi 读取pdf
  13. 联想g500网卡linux驱动,联想g500无线网卡驱动下载-lenovog500无线网卡驱动v10.0.0.225 官方版 - 极光下载站...
  14. 【读书笔记】淘宝技术这十年
  15. Stack (算法入门4)
  16. Android 开发常用性能优化工具总结
  17. 关于printf(%d,%d,i--,i++)的问题
  18. 去中心化的区块链如何理解?
  19. 88是python的整数类型吗_python基本数据类型
  20. 如何减少页面的重绘和回流(14)

热门文章

  1. logstsh xpack 认证_ElasticSearch Kibana 和Logstash 安装x-pack记录
  2. UVA11732 strcmp() Anyone?
  3. python精简笔记(五)——函数式编程
  4. Ubuntu 新装服务器部署流程
  5. 不仅仅是写代码,而是完成作品
  6. android 多屏幕适配 : 第一部分
  7. STL——内存基本处理工具
  8. Windows下Hadoop的环境安装[转]
  9. C语言 输入中文语句并按倒叙将它输出
  10. 哈工大中文信息处理_【NLP】哈工大车万翔教授 自然语言处理NLPer的核心竞争力是什么?19页ppt...