java n叉哈夫曼树_java-实现 哈夫曼树 二叉查找树

二叉树的应用

1,哈夫曼树和哈夫曼编码

//转载至:https://blog.csdn.net/jdhanhua/article/details/6621026

1.1首先是Node类,因为每次取出两个最小值都行从新排序,将Node实现

Comparable接口用于排序

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 public class Node implements Comparable{2 public int data=Integer.MAX_VALUE;3 public Node lchild=null;4 public Node rchild=null;5

6 publicNode(){}7 public Node(intdata){8 this.data=data;9 }10

11 @Override12 public intcompareTo(Node o) {13 if(o.data>this.data)14 return 1;15 if(o.data

View Code

1.2,hafuffmanTree类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 import java.util.*;2

3 /**

4 *5 * 建树,6 * 输出哈夫曼编码7 */

8

9

10 public classHaffmanTree {11 private Node root=newNode();12

13 /**

14 * 建树-①根据已排序的升序频率数组建树,每次取出前两个创建树,根节点为前两个和15 * ②将根节点插入数组,重新排序,重复①,直至结束16 *https://blog.csdn.net/jdhanhua/article/details/6621026

17 */

18 public Node createHaffmanTree(Listarray){19 while(array.size()>1){20 Collections.sort(array);21 Node left=array.get(array.size()-1);22 Node right=array.get(array.size()-2);23 Node newNode=new Node(left.data+right.data);24 newNode.lchild=left;25 newNode.rchild=right;26 array.remove(left);27 array.remove(right);28 array.add(newNode);29 //System.out.println("data: "+newNode.data);

30 }31 return array.get(0);32 }33

34 /**

35 * 打印编码36 https://www.it610.com/article/1296876477320601600.htm

37 遍历的时候加一个编码栈38 * 遍历的时候,进入左子树,0入栈,右子树,1入栈,39 * 遍历到叶子节点-输出,打印栈,40 *返回时栈顶退栈41 */

42 public void HaffmanCode(Node root,Stackstack){43 if(root==null)44 return;45 if(root.rchild==null&&root.rchild==null)//叶子节点

46 System.out.println(root.data+" "+stack);47 stack.push(0);48 HaffmanCode(root.lchild,stack);49 stack.pop();50

51 stack.push(1);52 HaffmanCode(root.rchild,stack);53 stack.pop();54 }55 //打印树-复制上一篇56 //H为频率数组个数

57 public void printTree(Node root,intH){58 int h=H;59 //System.out.println("树高:"+H);

60 if(H==0)61 System.out.println("树空,无打印");62 else{63 System.out.println("打印树:");64 Queue queue=new LinkedList<>();65 queue.add(root);66 int height=1;67 //记录每层孩子个数

68 int len=1;69 while(h>0){70 int length=0;71 String space=

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值