赫夫曼树。。

本文详细介绍了一种基于数组实现的赫夫曼树构建过程。通过遍历输入数组,将每个元素转化为节点并构建哈夫曼树。文章还提供了完整的Java代码实现,包括节点类定义及哈夫曼树的创建和遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 赫夫曼树:给定n个权值(只能是叶子)作为n个叶子节点,构成一颗二叉树,使得该数的带权路径长度(wpl)最小.

用数组完成

package day19;

import java.util.ArrayList;
import java.util.Collections;
//思考:根据left和right构造了一个哈夫曼树保存在了数组里面。
public class 哈夫曼树 {
    public static void main(String[] args) {
            int[] arr ={13,7,8,3,29,6,1};
        node root = createhefuman(arr);
        perorder(root);
    }
//    前序遍历
    public static void perorder(node root){
        if (root!=null){
            root.preorder();
        }else {
            System.out.println("为空树");
        }
    }


//    创建赫夫曼殊方法
    public static node createhefuman(int[] arr){
//       为了操作方便
//       1.遍历arr
//        2.将arr的每个元素构建成node
//        3,将node放入到arraylist中。
        ArrayList<node> nodes = new ArrayList<node>();
            for (int value:arr){
                nodes.add(new node(value)); //将数组每个元素构建成节点(带有权值),然后加入到数组里面。
            }
//排序
        while (nodes.size()>1) {
            Collections.sort(nodes);  //node实现了Comparable接口,可以用方法排序。
            System.out.println("nodes= " + nodes);
//        取出权值最小的节点
            node leftnode = nodes.get(0);
            //取出权值第二小的节点
            node rightnode = nodes.get(1);
            //构建新的二叉树
            node parent = new node(leftnode.value + rightnode.value);
            parent.left = leftnode;
            parent.right = rightnode;
//        删除
            nodes.remove(leftnode);
            nodes.remove(rightnode);
//       加入
            nodes.add(parent);
        }

        return nodes.get(0);
    }

}



//节点类
//为了让node支持排序,集合。     让node实现comparable接口
class node implements Comparable<node>{
    int value;//节点权值
    node left;  //左子节点
    node right; //右子节点

    public node(int value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "node{" +
                "value=" + value +
                '}';
    }

    @Override
    public int compareTo(node o) {
//       从小到大
        return this.value - o.value;
    }



//   前序遍历
    public void preorder(){
        System.out.println(this);
        if (this.left!=null){
            this.left.preorder();
        }
        if (this.right!=null){
            this.right.preorder();
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值