哈夫曼树的构造
来源:互联网 发布:java log4j pom 编辑:程序博客网 时间:2024/06/07 05:52
哈夫曼树的内容这里不作解释,请自己搜索。下面给出哈夫曼树构造过程的 Java 实现。
结点类:
- /**
- * 二叉树节点
- */
- public class Node implements Comparable {
- private int value;
- private Node leftChild;
- private Node rightChild;
- public Node(int value) {
- this.value = value;
- }
- public int getValue() {
- return value;
- }
- public void setValue(int value) {
- this.value = value;
- }
- public Node getLeftChild() {
- return leftChild;
- }
- public void setLeftChild(Node leftChild) {
- this.leftChild = leftChild;
- }
- public Node getRightChild() {
- return rightChild;
- }
- public void setRightChild(Node rightChild) {
- this.rightChild = rightChild;
- }
- public String toString(int level) {
- String indent = "";
- for (int i = 0; i < level; i++) {
- indent += " ";
- }
- return indent + value + "/n" +
- (leftChild != null ? leftChild.toString(level + 1) : "") +
- (rightChild != null ? rightChild.toString(level + 1) : "");
- }
- public int compareTo(Object o) {
- Node that = (Node) o;
- double result = this.value - that.value;
- return result > 0 ? 1 : result == 0 ? 0 : -1;
- }
- }
哈夫曼树构造类:
- public class HuffmanTreeBuilder {
- public static void main(String[] args) {
- List<Node> nodes = Arrays.asList(
- new Node(40),
- new Node(8),
- new Node(10),
- new Node(30),
- new Node(10),
- new Node(2)
- );
- Node node = HuffmanTreeBuilder.build(nodes);
- System.out.println(node.toString(0));
- }
- /**
- * 构造哈夫曼树
- *
- * @param nodes 结点集合
- *
- * @return 构造出来的树的根结点
- */
- private static Node build(List<Node> nodes) {
- nodes = new ArrayList<Node>(nodes);
- sortList(nodes);
- while (nodes.size() > 1) {
- createAndReplace(nodes);
- }
- return nodes.get(0);
- }
- /**
- * 组合两个权值最小结点,并在结点列表中用它们的父结点替换它们
- *
- * @param nodes 结点集合
- */
- private static void createAndReplace(List<Node> nodes) {
- Node left = nodes.get(nodes.size() - 1);
- Node right = nodes.get(nodes.size() - 2);
- Node parent = new Node(left.getValue() + right.getValue());
- parent.setLeftChild(left);
- parent.setRightChild(right);
- nodes.remove(nodes.size() - 1);
- nodes.remove(nodes.size() - 1);
- nodes.add(parent);
- sortList(nodes);
- }
- /**
- * 将结点集合由大到小排序
- *
- * @param nodes 结点集合
- */
- private static void sortList(List<Node> nodes) {
- Collections.sort(nodes);
- }
- }
说明:
1、HuffmanTreeBuilder 的 25 行新建了一个结点集合,以免对参数进行修改。
2、createAndReplace 方法首先获取末尾两个节点,然后构造它们的父结点,接着在结点集合中将这两个节点删除,把父结点加进去。
- 哈夫曼树的构造
- 哈夫曼树的构造
- 哈夫曼树的构造
- 哈夫曼树的构造
- 哈夫曼树的构造算法
- 构造哈夫曼树的算法
- 哈夫曼树的构造
- 哈夫曼树的构造
- 哈夫曼树的构造
- 哈夫曼树的构造
- 哈夫曼树的构造过程
- 哈夫曼树的构造,编码,译码
- 哈夫曼树的构造以及编码
- 哈夫曼树的构造(转载)
- 哈夫曼树的构造(转载)
- 哈夫曼树的构造(转载)
- 哈夫曼树的构造-C语言
- 哈夫曼树的构造和编码
- 小结一下最近碰到的一些应该注意的地方(PHP)
- vi编辑器命令详解
- World/Excel启动模版
- 2009年了!!
- save the transient instance before flushing错误解决办法
- 哈夫曼树的构造
- 深入浅出WPF——x:Class详解
- 向2009年说些什么
- 自定义控件(HolyrongGridView)-扩展GridView控件(2):自定义分页
- SQL Server中临时表与表变量的区别
- asp.net的TextBox回车触发事件
- "##"在宏中的作用
- 支持Firefox和IE的文本复制Javascript
- JPA 查询