`
Sunshineminyan
  • 浏览: 17606 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

HuffmanTree(最优二叉树)

 
阅读更多
基本知识:
树:一个结点下分成多个子结点,最上面的结点称为根结点(拥有倒立的树的形状)。
二叉树:一个结点下有且仅有左右两个子结点。
哈弗曼树:又称最优二叉树,是一类带权路径最短的树。
结点之间的路径长度:从一个结点到另一个结点之间的分支数目。
树的路径长度:从树的根到树中每一个结点的路径长度之和。
结点的带权路径长度:从该结点到树根之间的路径长度与结点上权的乘积。
树的带权路径长度:树中所有叶子结点的带权路径长度之和。
   计算机专业的同学应该都会学习《离散数学》,《离散数学》中就有哈弗曼树的构造和哈弗曼树的编码,可是即便是这样,要用java实现起来还是会有一定难度的。。。
哈弗曼树的构造:
1.根据给定的n个权值{w1,w2,...wn}构造n棵二叉树的集合F={T1,T2,...Tn},其中Ti中只有一个权值为wi的根结点,左右子树为空;
2.在F中选取两棵根结点的权值为最小的数作为左、右子树以结构一棵新的二叉树,且置新的二叉树的根结点的权值为左、右子树上根结点的权值之和;
3.将新的二叉树加入到F中,删除原两棵根结点权值最小的树;
4.重复2和3直到F中只含有一棵树为止,这棵树就是哈弗曼树。
哈弗曼树的编码:
从哈弗曼树的根结点开始,对左子树分配代码“0”,对右子树分配代码“1”,一直到达叶子结点为止,然后将从树根沿每条路径到达叶子结点的代码排列起来,便得到了哈弗曼编码。
构建二叉树:
package 二叉树;
//主函数
import java.util.Random;

public class Manage {

/**
* @param args
*/
public static void main(String[] args) {
Nodetree nt = new Nodetree();
Random rand = new Random();
for(int i=0;i<10;i++){
Node node =new Node(rand.nextInt(100));
nt.add(node);
System.out.print(node.getData()+"   ");
}
    System.out.println(" ");
    System.out.println("前序遍历:");
nt.preorder(nt.getRoot());
System.out.println(" ");
System.out.println("中序遍历:");
nt.inorder(nt.getRoot());
System.out.println(" ");
System.out.println("后序遍历:");
nt.postorder(nt.getRoot());
System.out.println(" ");
//节点的删除
// System.out.println("删除后的前序遍历:");
// nt.deleteNode(nt.getRoot().getRight());
// nt.preorder(nt.getRoot());
}

}
package 二叉树;

public class Node {
//结点数据
private int data;
//左子树结点
private Node left;
//右子树结点
private Node right;
//父节点
private Node parent;
//构造方法
int i;//用于记录此结点的值在数组中存放的位置
public Node(){
}
public Node(int data){
this.data=data;
}
public Node(int data,Node left,Node right,Node parent){
this.data=data;
this.left=left;
this.right=right;
this.parent=parent;
}
public Node getParent() {
return parent;
}
public void setParent(Node parent) {
this.parent = parent;
}
public void Print(){
System.out.print(this.data+"   ");
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
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;
}

}
package 二叉树;
public class Nodetree {
private Node root;// 根节点
/**
* 添加节点的方法
*/
public void add(Node node) {
// 判断root是否为null
if (null == root) {
root = node;
}else{
queryNode(root,node);
}
}
/**
* 查找节点的方法
* @param node1根节点
* @param node2要被添加的节点
* @return 返回要添加节点的位置
*/
private void queryNode(Node node1,Node node2){
if(node2.getData() > node1.getData()){
if(node1.getRight() != null){
queryNode(node1.getRight(),node2);
}else{
node1.setRight(node2);
}
}else{
if(node1.getLeft() != null){
queryNode(node1.getLeft(),node2);
}else{
node1.setLeft(node2);
}
}
}
// /**
// * 删除结点的方法(额。。。这个方法暂时还没弄好)
// * @param node要删除的节点
// */
// public void deleteNode(Node node){
// if(node!=null){
// if(node.getLeft()==null){
// node=null;
// }
// else if(node.getRight()==null){
// node=node.getLeft();
// node.setLeft(null);
// }
// else{
// node=null;
// }
// }
// else{
// return;
// }
// }
public Node getRoot() {
return root;
}

public void setRoot(Node root) {
this.root = root;
}
/**
* 遍历结点的方法
* @param node
*/
//前序遍历:  
public void preorder(Node node) {
if (node != null) {     
visit(node);
preorder(node.getLeft());     
preorder(node.getRight());   
}   
}
//中序: 
public void inorder(Node node) {
if (node != null) {
inorder(node.getLeft());
visit(node);     
inorder(node.getRight());   

}
//后序:
public void postorder(Node node) {
if (node != null) {
postorder(node.getLeft());
postorder(node.getRight());
visit(node);   

}
public void visit(Node node) {
System.out.print(node.getData()+"   ");

}
}
哈弗曼树:
见压缩包中
分享到:
评论

相关推荐

    Huffman编码树最优二叉树

    它的核心思想是通过构建一种特殊的二叉树——最优二叉树(也称为最小带权路径长度树),来实现对数据的编码。这种树的特点是:频率高的字符对应的路径较短,而频率低的字符对应的路径较长,从而使得编码后的平均码长...

    Java 最优二叉树的哈夫曼算法的简单实现

    Java 最优二叉树的哈夫曼算法的简单实现 Java 最优二叉树的哈夫曼算法的简单实现是对哈夫曼树的构建和实现。哈夫曼树是一种特殊的二叉树,它的每个结点都带有权值,并且遵循着大的值离根近、小的值离根远的原则,...

    C++编写HuffmanTree

    哈夫曼树,又称为最优二叉树,是由哈夫曼在1952年提出的。它是一种带权路径长度最短的二叉树,其中叶子节点代表需要编码的字符,权重代表字符出现的频率。哈夫曼树的特点是所有叶子节点都在最底层,且没有度为1的...

    binary-huffmantree.rar_Huffman tree_Huffman树_huffman_二叉排序树

    哈夫曼树,也称为最优二叉树或最小带权路径长度树,是一种特殊的二叉树结构,其目的是通过自底向上地合并权重最小的节点来最小化编码的平均长度。 首先,理解哈夫曼编码的基本原理至关重要。它基于字符出现频率,将...

    Huffman Tree (C#)

    哈夫曼树(Huffman Tree),也称为最优二叉树,是数据压缩中的一种关键算法,主要用于构建哈夫曼编码。在C#编程语言中实现哈夫曼算法,可以高效地处理字符频率统计并生成相应的编码,从而实现数据的压缩。 哈夫曼...

    huffmanTree

    哈夫曼树(Huffman Tree),也称为最优二叉树,是数据压缩技术中的关键概念。这个数据结构是由美国计算机科学家David A. Huffman在1952年提出的,主要用于构造哈夫曼编码,以实现高效的无损数据压缩。在本话题中,...

    链表HuffmanTree.rar

    哈夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树,广泛应用于数据压缩和编码领域。这个资料包提供了一种基于链表实现的哈夫曼树构建方法,相较于其他实现方式,链表结构更加紧凑,内存占用较小,且易于...

    C语言-链表HUFFMANTREE.zip

    接下来,我们讨论哈夫曼树,也叫最优二叉树或最小带权路径长度树。哈夫曼树是一种特殊的二叉树,用于数据压缩。它的构造基于哈夫曼编码,通过对输入字符出现频率的统计,构造出一棵具有最小带权路径长度的树。在这个...

    链表HuffmanTree.zip

    哈夫曼树,又称最优二叉树,是一种带权路径长度最短的二叉树。在数据压缩领域,哈夫曼编码是一种高效的无损压缩方法,通过构建哈夫曼树为每个字符分配唯一的前缀编码,使得频繁出现的字符拥有较短的编码,从而降低...

    HuffmanTree的实现代码

    哈夫曼树(Huffman Tree),也称为最优二叉树,是一种特殊的二叉树结构,广泛应用于数据压缩领域。在哈夫曼树中,每个叶子节点代表一个输入符号,其权值代表该符号的频率,而内部节点则不携带任何信息。通过构建...

    HuffMan【二叉树、树和哈夫曼树及其应用】

    在IT领域,数据结构是计算机科学的基础,而哈夫曼树(Huffman Tree),又称为最优二叉树,是数据结构中的一个重要概念。哈夫曼树主要用于数据的压缩,通过构建一种特殊的二叉树结构来实现高效的数据编码,从而达到...

    Huffman编码(二叉树应用).zip_Huffman树_huffman_哈夫曼编码_哈弗曼编码_赫夫曼编码

    哈夫曼编码是一种高效的数据压缩方法,它基于一种特殊的二叉树——哈夫曼树(Huffman Tree),也称为最优二叉树。这种编码技术在信息传输和存储中有着广泛的应用,因为它能最大限度地减少数据的存储空间。下面将详细...

    链表HuffmanTree(1).zip

    哈夫曼树,又称为最优二叉树,是一种带权路径长度最短的二叉树。在信息编码中,哈夫曼树用于构造哈夫曼编码,实现数据的高效压缩。哈夫曼树的构建过程包括以下步骤: 1. **构建哈夫曼树的过程**:首先,将所有要...

    C语言开发----链表HuffmanTree.rar

    接下来,我们探讨哈夫曼树(Huffman Tree),也称为最优二叉树,是数据编码的一种方法,主要用于数据压缩。哈夫曼编码的原理是为数据符号分配最短的二进制代码,使得频率高的字符代码长度短,频率低的字符代码长度长...

Global site tag (gtag.js) - Google Analytics