赫夫曼树

直接上代码,也不讲概念了

package tree;

import java.util.ArrayList;
import java.util.List;

/**
 * Class HuffmanTree ...
 *
 * @author LiJun
 * Created on 2019/4/12
 */
public class HuffmanTree {
    private static class Node {
        String data;
        double weight;
        Node left;
        Node right;

        public Node(String data, double wight) {
            this.data = data;
            this.weight = wight;
        }

        public Node(String data, double weight, Node left, Node right) {
            this.data = data;
            this.weight = weight;
            this.left = left;
            this.right = right;
        }

        @Override
        public String toString() {
            return "Node{" +
                    "data=" + data +
                    ", weight=" + weight +
                    '}';
        }

        public double getWeight() {
            return weight;
        }
    }

    public static void main(String[] args) {
        List<Node> nodes = new ArrayList<Node>();

        nodes.add(new Node("A", 40.0));
        nodes.add(new Node("B", 8.0));
        nodes.add(new Node("C", 10.0));
        nodes.add(new Node("D", 30.0));
        nodes.add(new Node("E", 10.0));
        nodes.add(new Node("F", 2.0));
        Node root = HuffmanTree.createTree(nodes);
        huffmanPrint(root);
    }

    /**
     * 构建一棵赫夫曼树
     * @param nodes 节点
     * @return 构造出来的根节点
     */
    public static Node createTree(List<Node> nodes) {
        while (nodes.size() > 1) {
            nodes.sort((node1, node2) -> node1.weight <= node2.weight ? 1 : -1);
            Node left = nodes.remove(nodes.size() - 1);
            Node right = nodes.remove(nodes.size() - 1);
            Node t = new Node(null, left.weight + right.weight, left, right);
            nodes.add(t);
        }
        return nodes.get(0);
    }
    public static void huffmanPrint(Node root){
        if(root == null)return;
        huffmanPrint(root.left);
        if(root.left == null && root.right == null)
            System.out.print(root);
        huffmanPrint(root.right);

    }

    /**
     * 中序遍历
     */
    public void inOrderPrint(Node root){
        if(root == null) return;
        inOrderPrint(root.left);
        System.out.print(root);
        inOrderPrint(root.right);
    }
    /**
     * 先序遍历
     */
    public void preOrderPrint(Node root){
        if(root == null) return;
        System.out.print(root);
        inOrderPrint(root.left);
        inOrderPrint(root.right);
    }
    /**
     * 先序遍历
     */
    public void postOrderPrint(Node root){
        if(root == null) return;
        inOrderPrint(root.left);
        inOrderPrint(root.right);
        System.out.print(root);
    }
}

我打印一下每一圈之后的nodes节点

[Node{data=A, weight=40.0}, Node{data=D, weight=30.0}, Node{data=C, weight=10.0}, Node{data=E, weight=10.0}, Node{data=B, weight=8.0}, Node{data=F, weight=2.0}]

[Node{data=A, weight=40.0}, Node{data=D, weight=30.0}, Node{data=C, weight=10.0}, Node{data=E, weight=10.0}, Node{data=null, weight=10.0}]

[Node{data=A, weight=40.0}, Node{data=D, weight=30.0}, Node{data=null, weight=20.0}, Node{data=C, weight=10.0}]

[Node{data=A, weight=40.0}, Node{data=D, weight=30.0}, Node{data=null, weight=30.0}]

[Node{data=null, weight=60.0}, Node{data=A, weight=40.0}]

[Node{data=null, weight=100.0}]

来个图吧

在这里插入图片描述

权越大的路径越短,权越小的路径越长

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值