哈夫曼树的简单实现(Java)

这篇博客介绍了如何使用Java实现哈夫曼树。首先定义了一个Node类来表示带有权值的节点,然后通过将数组中的数据转化为Node对象并进行升序排序,依次取两个最小权重节点组合成新的节点,直至数组只剩一个节点,从而构建哈夫曼树。最后,实现了前序遍历的方法来展示构建好的树结构。
摘要由CSDN通过智能技术生成

1.定义节点

package haffman;

public class Node implements Comparable<Node>{

    public int val; // 权值

    public Node left;

    public Node right;

    public Node(int val) {
        this.val = val;
    }

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


    @Override
    public int compareTo(Node o) {
        return this.val - o.val;
    }

    /**
     * 前序遍历
     */
    public void preList() {
        System.out.println(this);

        if (this.left != null) {
            this.left.preList();
        }

        if (this.right != null) {
            this.right.preList();
        }
    }

}

2.哈夫曼树的简单实现和测试

package haffman;

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

public class HaffmanTree {
    public static void main(String[] args) {
        int[] array = {13, 7, 8, 29, 6, 1};
        Node root = createHaffmanTree(array);
        pre(root);
    }

    /**
     * 转化为哈夫曼树的基本步骤为:
     * 1.把数组中的数据转化为带有权值的Node结点
     * 2.把结点按照权重大小进行升序排序
     * 3.每次取出数组的前两个结点进行相加组成一个新的临时节点
     * 4.把前两个节点分别设为临时节点的左右节点
     * 5.把取出的两个节点从数组中移除,并且把临时节点添加到数组
     * 6.重复2-5步骤,直到数组长度为1
     * 7.返回头结点用于遍历
     * @param a
     * @return
     */
    public static Node createHaffmanTree(int[] a) {
        // 数组转化为结点
        List<Node> list = new ArrayList<>();

        for (int i:a) {
            list.add(new Node(i));
        }

        while (list.size()>1) {
            // 排序
            Collections.sort(list);
            // 查看每次数组的变化
            System.out.println("排序后的数组为:" + list);

            // 取出头两个节点
            Node leftNode = list.get(0);
            Node rightNode = list.get(1);

            // 创建临时节点
            Node root = new Node(leftNode.val+rightNode.val);
            root.left = leftNode;
            root.right = rightNode;

            list.remove(leftNode);
            list.remove(rightNode);
            list.add(root);

        }

        return list.get(0);

    }

    /**
     * 前序遍历
     */
    public static void pre(Node node) {
        if (node != null) {
            node.preList();
        }else {
            System.out.println("二叉树为空");
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值