哈夫曼树 java

本文介绍了一个使用Java实现的哈夫曼树构建过程。通过将一系列数值转化为节点,并利用优先级队列进行排序,最终构建出一棵哈夫曼树。文章详细展示了如何通过循环和排序操作,不断合并最小的两个节点,直至生成完整的哈夫曼树,并提供了树的遍历方法。
package com.数据结构;

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

public class 哈夫曼树 {
    //将数列转成哈夫曼树
    public static void main(String[] args) {
        int[] arr = new int[]{13,7,8,3,29,6,1};
        ArrayList<NodeTree> list = new ArrayList<>();
        for(int temp : arr){
            list.add(new NodeTree(temp));
        }
        while(list.size()>1){
            Collections.sort(list);
            NodeTree n1 = list.get(0);
            NodeTree n2 = list.get(1);
            NodeTree n3 = new NodeTree(n1.getData()+n2.getData(),n1,n2);
            list.remove(n1);
            list.remove(n2);
            list.add(n3);
        }
        new HafmTree(list.get(0)).look();
    }
}
class HafmTree{
    private NodeTree root;

    public HafmTree() {
    }

    public HafmTree(NodeTree root) {
        this.root = root;
    }
    public void look(){
        if(root==null){
            System.out.println("数空 无法遍历");
        }else{
            this.root.look();
        }
    }
}
class NodeTree implements Comparable<NodeTree>{ //树结点
    private int data;
    private NodeTree Lift ;
    private NodeTree Right ;

    public NodeTree() {
    }

    public NodeTree(int data) {
        this.data = data;
    }

    public NodeTree(int data, NodeTree lift, NodeTree right) {
        this.data = data;
        Lift = lift;
        Right = right;
    }

    public int getData() {
        return data;
    }

    public void setData(int data) {
        this.data = data;
    }

    public NodeTree getLift() {
        return Lift;
    }

    public void setLift(NodeTree lift) {
        Lift = lift;
    }

    public NodeTree getRight() {
        return Right;
    }

    public void setRight(NodeTree right) {
        Right = right;
    }
    public void look(){ //前序遍历
        System.out.println(this);
        if(this.getLift()!=null){
            this.getLift().look();
        }
        if(this.getRight()!=null){
            this.getRight().look();
        }

    }
    @Override
    public int compareTo(NodeTree o) { //升序排序
        return this.data-o.data;
    }

    @Override
    public String toString() {
        return "NodeTree{" +
                "data=" + data +
                '}';
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值