一、感想
古有云:“观千剑而后识器,操千曲而后晓声”。
数据结构写过后,感觉要快速的编写出代码还是有难度的。之所以会出现这种情况不是不了解这种数据结构,
而是不太会将一种逻辑结构快速的转化为代码的形式编码出来,所以数据结构的编码就变得重要了,能清晰的
快速的编写出一种数据结构,就能很好的操作多种逻辑关系了。数据结构里面包含的关系太多了,对知识点的
运用也是相当多的,清晰的掌握基本的数据结构就能很好的在平常的编码中将需求中的逻辑关系用代码描绘出来。
二、知识点
HuffmTree是二叉树的一种,和一般的树不同的是HuffmTree是带权值的树,而且要求所有的节点的权值之和要最小
任何树都可以拆分成数据+结构两部分;HuffmTree的数据部分就是节点所带的权值,而结构就是左右节点,和根节
点的结构关系。
三、代码陈述:
定义数据Node类包括权值和左右节点信息
package com.tree;
/**
*
* @author Administrator
*
*/
public class Node {
public int value;
public Node leftNode;
public Node rightNode;
public Node(int value) {
super();
this.value = value;
}
}
2、创建Tree
package com.tree;
import java.util.LinkedList;
public class Tree {
public int[] values = { 1, 4, 7,6 };// 用来输入值
public LinkedList<Node> list = new LinkedList<Node>();// 用来保存值,并实现对值得比较
// 用来存放哈夫曼编码的数组
public String[] code = new String[60];
// 创建树
public void createTree() {
for (int i = 0; i < values.length; i++) {
Node node = new Node(values[i]);
// 首先将节点对应的权值存储到链表里面
list.add(getIndex(values[i]), node);
}
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).value);
}
while (list.size() > 1) {
// 从链表里面移除第0个位置的值,并赋给左节点和右节点
Node node_left = list.remove(0);
Node node_right = list.remove(0);
// 把左节点和右节点的权值赋给根节点
Node root = new Node(node_left.value + node_right.value);
root.leftNode = node_left;
root.rightNode = node_right;
// 得到当前根节点的当前索引值
list.add(getIndex(root.value), root);
}
Node root = list.get(0);
getCode(root, "");
}
// 实现对节点的权值排序
public int getIndex(int value) {
// 遍历链表拿到每个位置对应的节点
for (int i = 0; i < list.size(); i++) {
Node node = list.get(i);
// 从链表里面拿到值与该位置的节点的权值进行比较
if (value < node.value) {
// 如果该值与队列里面的节点权值相等则把该位置给该值
return i;
}
}
// 最后返回链表的总长度
return list.size();
}
// 得到哈夫曼编码
public void getCode(Node root, String huffmCode) {
if (root.leftNode == null && root.rightNode == null) {
code[root.value] = huffmCode;
System.out.println(root.value+"哈夫曼编码为"+huffmCode);
}
if (root.leftNode != null) {
getCode(root.leftNode, huffmCode + "0");
}
if (root.rightNode != null) {
getCode(root.rightNode, huffmCode + "1");
}
}
}