本文的代码来自于《数据结构与算法(JAVA语言版)》,是笔者在网上找到的资料,非正式出刊版物。笔者对代码一些比较难以理解的部分添加了注释和图解,欢迎大家来讨论。

import dsa.adt.BinaryTreeLinked;public class HuffmanTreeLinked extends BinaryTreeLinked {public HuffmanTreeLinked(HuffmanTreeNode[] nodes) {this(nodes,new DefaultStrategy());}public HuffmanTreeLinked(HuffmanTreeNode[] nodes, Strategy strategy){super(buildHuffmanTree(nodes),strategy);generateHuffmanCode((HuffmanTreeNode)super.getRoot());}//返回Huffman的所有叶子结点public Iterator getAllLeafs(){LinkedList list = new LinkedListDLNode();getLeafs(getRoot(),list);return list.elements();}private void getLeafs(HuffmanTreeNode root, LinkedList list){if (root==null) return;if (root.isLeaf()) list.insertLast(root);getLeafs(root.getLChild(),list);getLeafs(root.getRChild(),list);}//递归生成Huffman编码private static void generateHuffmanCode(HuffmanTreeNode root){if (root==null) return;if (root.hasParent()){if (root.isLChild()) root.setCoding(root.getParent().getCoding() + "0");else                 root.setCoding(root.getParent().getCoding() + "1");}generateHuffmanCode(root.getLChild());generateHuffmanCode(root.getRChild());}//通过结点数组生成Huffman树private static HuffmanTreeNode buildHuffmanTree(HuffmanTreeNode[] nodes){int n = nodes.length;if (n<2) return nodes[0];List l = new ListArray();   //根结点线性表,按weight从大到小有序for (int i=0; i<n; i++)     //将结点逐一插入线性表insertToList(l,nodes[i]);for (int i=1; i<n; i++){    //选择weight最小的两棵树合并,循环n-1次HuffmanTreeNode min1 = (HuffmanTreeNode)l.remove(l.getSize()-1);//选择weight最小的树HuffmanTreeNode min2 = (HuffmanTreeNode)l.remove(l.getSize()-1);//选择weight次小的树HuffmanTreeNode newRoot = new HuffmanTreeNode(min1.getWeight()+min2.getWeight());//合并newRoot.setLChild(min1);newRoot.setRChild(min2);insertToList(l,newRoot);//新树插入线性表}return (HuffmanTreeNode)l.get(0);//返回Huffman树的根}//将结点按照weight从大到小的顺序插入线性表private static void insertToList(List l, HuffmanTreeNode node){for (int j=0; j<l.getSize(); j++)if (node.getWeight()>((HuffmanTreeNode)l.get(j)).getWeight()){l.insert(j,node);return;}l.insert(l.getSize(),node);}public HuffmanTreeNode getRoot(){return (HuffmanTreeNode)super.getRoot();}
}

package dsa.adt;import dsa.adt.BinTreeNode;public class HuffmanTreeNode extends BinTreeNode {private int weight;         //权值private String coding = ""; //编码public HuffmanTreeNode(int weight){this(weight,null);}public HuffmanTreeNode(int weight, Object e){super(e);this.weight = weight;}//改写父类方法public HuffmanTreeNode getParent() {return (HuffmanTreeNode)super.getParent();}public HuffmanTreeNode getLChild() {return (HuffmanTreeNode)super.getLChild();}public HuffmanTreeNode getRChild() {return (HuffmanTreeNode)super.getRChild();}//get&set方法public int getWeight(){ return weight;}public String getCoding(){ return coding;}public void setCoding(String coding){ this.coding = coding;}
}

public interface Strategy {//判断两个数据元素是否相等public boolean equal(Object obj1, Object obj2);/*** 比较两个数据元素的大小* 如果obj1 < obj2 返回-1* 如果obj1 = obj2 返回0* 如果obj1 > obj2 返回1*/public int compare(Object obj1, Object obj2);
}

public final class DefaultStrategy implements Strategy
{public boolean equal(Object obj1, Object obj2) {return obj1.toString().equals(obj2.toString());}public int compare(Object obj1, Object obj2){int comp = obj1.toString().compareTo(obj2.toString());if (comp==0) return 0;else if (comp>0) return 1;else return -1;}
}

数据结构之基于Java的最优二叉树实现相关推荐

  1. java 实现最优二叉树_哈夫曼树(最优二叉树)及其Java实现

    一.定义 一些定义: 节点之间的路径长度:在树中从一个结点到另一个结点所经历的分支,构成了这两个结点间的路径上的经过的分支数称为它的路径长度 树的路径长度:从树的根节点到树中每一结点的路径长度之和.在 ...

  2. java 实现最优二叉树_哈夫曼树(最优二叉树) - Java实现

    简介 哈夫曼树(Huffman)树又称最优二叉树,是指对于一组带有确定权值的叶子结点所构造的具有带权路径长度最短的二叉树.从树中一个结点到另一个结点之间的分支构成了两结点之间的路径,路径上的分支个数称 ...

  3. 【数据结构】基于二叉链表的二叉树结点个数的统计

    基于二叉链表的二叉树结点个数的统计 描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写三个递归算法分别对二叉树的结点(度为0.1.2)个数进行统计. 输入 多组数据.每组数 ...

  4. 数据结构之基于Java的二叉树实现

    本文的代码来自于<数据结构与算法(JAVA语言版)>,是笔者在网上找到的资料,非正式出刊版物.笔者对代码一些比较难以理解的部分添加了注释和图解,欢迎大家来讨论. public class ...

  5. 数据结构之基于Java的顺序列表实现

    本文的代码来自于<数据结构与算法(JAVA语言版)>,是笔者在网上找到的资料,非正式出刊版物.笔者对代码一些比较难以理解的部分添加了注释和图解,欢迎大家来讨论. public class ...

  6. 数据结构之基于Java的链接列表实现

    本文的代码来自于<数据结构与算法(JAVA语言版)>,是笔者在网上找到的资料,非正式出刊版物.笔者对代码一些比较难以理解的部分添加了注释和图解,欢迎大家来讨论. 双链表实现结构图 publ ...

  7. 数据结构之基于Java的顺序栈实现

    本文的代码来自于<数据结构与算法(JAVA语言版)>,是笔者在网上找到的资料,非正式出刊版物.笔者对代码一些比较难以理解的部分添加了注释和图解,欢迎大家来讨论. public class ...

  8. 数据结构之基于Java的链接栈实现

    本文的代码来自于<数据结构与算法(JAVA语言版)>,是笔者在网上找到的资料,非正式出刊版物.笔者对代码一些比较难以理解的部分添加了注释和图解,欢迎大家来讨论. public class ...

  9. 数据结构之基于Java的顺序队列实现

    本文的代码来自于<数据结构与算法(JAVA语言版)>,是笔者在网上找到的资料,非正式出刊版物.笔者对代码一些比较难以理解的部分添加了注释和图解,欢迎大家来讨论. 重点理解通过取余运算将线性 ...

最新文章

  1. KDE社区:首个KDialogue正式开放
  2. 尊重个体多样性,科学人文终统一
  3. 普通人为什么要学习Python
  4. 2020国开c语言程序设计1075,代号1253国开点大2017年6月春季学期本科期末考试《C语言程序设计》试题及答案.pdf...
  5. 北航教授李帅:“VR+医疗”仿真系统及关键技术分享
  6. thinkphp ajax 无刷新分页效果的实现
  7. C++产生指定范围内的随机数/随机小数
  8. Linux下安装MongoDB
  9. 拔剑金三银四:大厂面试流程、面试套路分享!你准备好“进厂拧螺丝”了吗?
  10. CAD交互绘制虚线(网页版)
  11. 什么是CPU Die?
  12. 网易云评论 爬虫 java_网易云歌曲评论爬虫如何实现翻页?
  13. PostgreSQL数据库WAL——RM_HEAP_ID日志记录动作
  14. 企鹅吞狗,狗走狐悲,狼厂危矣
  15. 直播第三方美颜sdk是什么?
  16. windows 安装Ubuntu 子系统
  17. HackTheBox 如何使用
  18. 虚拟机 安装 CUDA 可行性分析操作
  19. 迷你linux服务器,迷你Linux发行版 4MLinux 34.0 来了,你有试过吗
  20. Ubuntu18.04LTS安装Nvidia显卡驱动

热门文章

  1. 学习Python+numpy数组运算和矩阵运算看这254页PPT就够了
  2. 微课|玩转Python轻松过二级(2.2.1节):算术运算符
  3. was java heap_Websphere产生大量javacore与heapdump文件的分析
  4. html固定悬浮窗效果,js 固定悬浮效果实现思路代码
  5. 15数字华容道解法 图解_密不外传的点穴秘技:15个穴位的取穴、点法、解法(上)...
  6. python如何使用多线程_Python多线程与多线程中join()的用法
  7. java 不同类数据的传递_java 数据在不同类之间的传递
  8. vue cli脚手架详解_vue-cli脚手架搭建vue项目搭建
  9. android 图片弹跳效果,设置点的弹跳效果
  10. 为什么只有三次挥手_TCP为什么要三次握手?为什么要有四次挥手?