二叉树的应用
1,哈夫曼树和哈夫曼编码
//转载至:https://blog.csdn.net/jdhanhua/article/details/6621026
1.1首先是Node类,因为每次取出两个最小值都行从新排序,将Node实现
Comparable接口用于排序
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类
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=