huffman树java_(哈夫曼树)HuffmanTree的java实现

参考自:http://blog.csdn.net/jdhanhua/article/details/6621026

哈夫曼树

哈夫曼树(霍夫曼树)又称为最优树.

1、路径和路径长度

在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长

2、结点的权及带权路径长度

若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。

3、树的带权路径长度

树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL。

代码一(树节点):

/**

* 树节点

*

* @author pang

*

* @param

*/

public class Node implements Comparable> {

private T data;

private int weight;

private Node left;

private Node right;

public Node(T data, int weight) {

this.data = data;

this.weight = weight;

}

@Override

public String toString() {

// TODO Auto-generated method stub

return "data:" + this.data + ",weight:" + this.weight + "; ";

}

@Override

public int compareTo(Node o) {

// TODO Auto-generated method stub

if (o.weight > this.weight) {

return 1;

} else if (o.weight < this.weight) {

return -1;

}

return 0;

}

public T getData() {

return data;

}

public void setData(T data) {

this.data = data;

}

public int getWeight() {

return weight;

}

public void setWeight(int weight) {

this.weight = weight;

}

public Node getLeft() {

return left;

}

public void setLeft(Node left) {

this.left = left;

}

public Node getRight() {

return right;

}

public void setRight(Node right) {

this.right = right;

}

}

代码二(HuffmanTree):

import java.util.ArrayList;

import java.util.Collections;

import java.util.LinkedList;

import java.util.List;

import java.util.Queue;

public class HuffmanTree {

public static Node createTree(List> nodes) {

while (nodes.size() > 1) {

Collections.sort(nodes);

Node left = nodes.get(nodes.size() - 1);

Node right = nodes.get(nodes.size() - 2);

Node parent = new Node(null, left.getWeight()

+ right.getWeight());

parent.setLeft(left);

parent.setRight(right);

nodes.remove(left);

nodes.remove(right);

nodes.add(parent);

}

return nodes.get(0);

}

public static List> breath(Node root) {

List> list = new ArrayList>();

Queue> queue = new LinkedList<>();

queue.add(root);

while (!queue.isEmpty()) {

Node pNode = queue.poll();

list.add(pNode);

if (pNode.getLeft() != null) {

queue.add(pNode.getLeft());

}

if (pNode.getRight() != null) {

queue.add(pNode.getRight());

}

}

return list;

}

}

测试类:

import java.util.ArrayList;

import java.util.List;

public class HuffmanTreeTest {

public static void main(String[] args) {

// TODO Auto-generated method stub

List> nodes = new ArrayList>();

nodes.add(new Node("b", 5));

nodes.add(new Node("a", 7));

nodes.add(new Node("d", 2));

nodes.add(new Node("c", 4));

Node root = HuffmanTree.createTree(nodes);

System.out.println(HuffmanTree.breath(root));

}

}

哈夫曼树&lpar;三&rpar;之 Java详解

前面分别通过C和C++实现了哈夫曼树,本章给出哈夫曼树的java版本. 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载请注明出处:htt ...

哈夫曼树的介绍 ---java实现

一.     什么是哈夫曼树 是一种带权路径长度最短的二叉树,也称最优二叉树 带权路径长度:WPL=(W1*L1+W2*L2+W3*L3+...+ Wn*Ln) N个权值Wi(i=1,2,...n)构 ...

java实现哈夫曼树进行文件加解压

目录 1.哈夫曼树简述 2.构造树的节点 3.构造哈夫曼树的类(压缩) 4.构造哈夫曼树的类(解压) 5.整体工程文件(包括测试类) 6.结果 7.参考链接 1.哈夫曼树简述 给定n个权值作为n个叶子 ...

Java实现WUST 1002&colon; 哈夫曼树

[问题描述] 根据给定的若干权值可以构造出一颗哈夫曼树.构造的哈夫曼树可能不唯一,但是按照下面的选取原则所构造出来的哈夫曼树应该是唯一的. (1)每次选取优先级最低的两个结点,优先级最低的作为左子树, ...

c&plus;&plus;实现哈夫曼树,哈夫曼编码,哈夫曼解码(字符串去重,并统计频率)

#include #include #include #include ...

20172332 2017-2018-2 《程序设计与数据结构》Java哈夫曼编码实验--哈夫曼树的建立,编码与解码

20172332 2017-2018-2 Java哈夫曼编码实验--哈夫曼树的建立,编码与解码 哈夫曼树 1.路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子 ...

Java中的哈夫曼树

package com.ietree.basic.datastructure.tree; import java.util.ArrayDeque; import java.util.ArrayList ...

高级数据结构---赫&lpar;哈&rpar;夫曼树及java代码实现

我们经常会用到文件压缩,压缩之后文件会变小,便于传输,使用的时候又将其解压出来.为什么压缩之后会变小,而且压缩和解压也不会出错.赫夫曼编码和赫夫曼树了解一下. 赫夫曼树: 它是一种的叶子结点带有权重的 ...

6-9-哈夫曼树(HuffmanTree)-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第6章  树和二叉树 - 哈夫曼树(HuffmanTree) ——-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ ...

随机推荐

C&num; 数据类型

1.整数类型:  int    只能 存储证书,不能存储小数. 2.小数类型: doubie 机能存储整数,也能存储小数,小数点后面的额 15-16位. 3.金钱类型: decimal:用来存储金钱, ...

git基本用法说明(原创&plus;验证)

关于文件状态   一般仓库中的文件可能存在于这4种状态: 1)Untracked files                     → 文件未被跟踪(A)  2)Untracked but no ...

什么是AIDL(转)

跨进程访问的服务称为AIDL(Android Interface Definition Language)服务. AIDL:Android Interface Definition Language, ...

poj 1611 The Suspects 并查集

The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 30522   Accepted: 14836 De ...

BeanUtils&period;copyProperties&lpar;&rpar; 用法--部分转

把一个类对象copy到另一个类对象(这两个可以不同). 1.org.apache.commons.beanutils.BeanUtils.copyProperties(dest, src) org.s ...

Grunt的配置和使用

Grunt和Grunt插件是通过NodeJs的包管理工具npm安装并进行管理的. Grunt 0.4.x必须配合NodeJs=>0.8.0版本使用(奇数版本的NodeJs不是稳定的开发版本)   ...

Redis的值value(数据结构类型)

Redis的数据结构类型,指的是redis的值的value类型: Redis的常用数据结构类型:string,list,set,sortedSet,hash 一.sting的类型 string类型是r ...

【转】 诡异的ORA-02289&colon; sequence does not exist

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值