构建哈夫曼树及求它的带权路径长度_哈夫曼树结构和带权路径长度计算_可乐学算法的博客-程序员宅基地

技术标签:   哈夫曼树  

给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。要构成哈夫曼树,值比较大的叶子节点高度越低越好。

(1) 将n个权值看出n颗只有根节点的树,构建n颗树。
(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
(3)从森林中删除选取的两棵树,并将新树加入森林;
(4)重复(2)(3)步n-1遍,最后森林中只有一棵树,这棵树就是哈夫曼树。
(5)直接用递归求它的带权路径长度即可。

java参考代码:


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class Main
{
    
	public static void main(String[] args) 
	{
    
		Scanner sc=new Scanner(System.in);
		int n = sc.nextInt();
		List<Tree> ts=new ArrayList<Tree>();
		//构建n颗只有根节点的树
		for(int i=0;i<n;i++)
			ts.add(new Tree(sc.nextInt()));
		//进行n-1次,删除最小的两棵树,合并两棵树并加进去
		for(int i=0;i<n-1;i++)
			removeAndAdd(ts);
		//求带权路径长度
		int ans=getNum(ts.get(0),0);
		System.out.println(ans);
		
	}
	
	private static int getNum(Tree tree,int n) 
	{
    
		if(tree.left==null&&tree.right==null)
			return tree.data*n;
		return getNum(tree.left, n+1)+getNum(tree.right, n+1);		
	}

	private static void removeAndAdd(List<Tree> ts) 
	{
    
		int min1=Integer.MAX_VALUE;
		int min2=Integer.MAX_VALUE;
		int inx1=-1;
		int inx2=-1;
		//找出两个最小值
		for(int i=0;i<ts.size();i++)
		{
    
			Tree t=ts.get(i);
			if(t.data<min1)
			{
    
				min1=t.data;
				inx1=i;
			}
			else if(t.data<min2)
			{
    
				min2=t.data;
				inx2=i;
			}
		}
		
		//删除两颗最小的数,合并两棵树,并加入
		Tree t1=ts.get(inx1);
		Tree t2=ts.get(inx2);
		Tree t=new Tree(t1.data+t2.data);
		t.left=t1;
		t.right=t2;
		ts.remove(t1);
		ts.remove(t2);
		ts.add(t);
		
	}

	
}

class Tree
{
    
	int data;
	Tree left;
	Tree right;
	Tree(int data) {
    
		super();
		this.data = data;
	}

}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41022094/article/details/102817189

智能推荐

MyBatis-映射器中selectKey标签详解_映射文件中insert的selectkey子元素-程序员宅基地

selectKey用来处理不支持自动生成主键的数据库只能存在于insert或update的子标签中,一般不建议使用.注意selectKey的主要效用并不是用来处理自动生成主键的,其本质作用是:用sql语句来处理,需要特殊处理的表中的列字段,而不是用java代码来处理,以此来减少代码的冗余度.候选属性介绍keyProperty结果集映射目标类的属性;若存在多个,则使用逗号分隔;..._映射文件中insert的selectkey子元素

Celery消息队列----配置定时任务-程序员宅基地

Introduction celery beat is a scheduler; It kicks off tasks at regular intervals, that are then executed by available worker nodes in the cluster.By default the entries are taken from the beat_schedul

linux 同步机制之complete wait_for_completion-程序员宅基地

在Linux内核中,completion是一种简单的同步机制,标志"things may proceed"。要使用completion,必须在文件中包含,同时创建一个类型为struct completion的变量。[cpp] view plaincopy这个变量可以静态地声明和初始化: DECLARE_COMPLETION(my_comp); _wait_for_completion

说实话我只能灌水,我谈技术你们有几个懂的啊?不信?随便发一段我写的代你们有几个能看懂的啊? -程序员宅基地

说实话我只能灌水,我谈技术你们有几个懂的啊?不信?随便发一段我写的代你们有几个能看懂的啊? 视频: 刘德华中国人 藏拙贴吧视频音乐了 视频发表方法: 跟发表图片一样,只要链接是以 .swf 结尾系统就会默认为你发表的是视频了 音乐发表方法: 跟发表图片一样,只要链接是以 .mp3 或 .wma 结尾系统就会默认为你发表的是音乐了 其余的都按照图片方式进行处理 相关处理代码 int LinkType

matlab求右特征向量,什么是左右特征向量_?? 1的博客-程序员宅基地

满意答案brxps2017.10.06采纳率:42%等级:8已帮助:509人A=[2 4 6;8 10 12;16 20 10]A =2 4 68 10 1216 20 10>> [x,y]=eig(A)%x为右特征向量,s为左特征向量,v为规格化的左特征向量x =-0.25057066610473 -0.75728611172496 ..._matlab求左右特征向量

Java-文档注释-程序员宅基地

1 Java注释概述 Java的三种注释: (1)单行注释:// 注释内容 (2)多行注释:/… 注释内容…./ (3)文档注释:/*.. 注释内容…./ (这种注释可以用来自动地生成文档。在JDK中有个javadoc的工具,可以由源文件生成一个HTML文档。使用这种方式注释源文件的内容,显得很专业,并且可以随着源文件的保存而保存起来。也就是说,当修改源文件时...

随便推点

89/90/91/92/93.JAVA入门__基础知识练习_输入星期数,显示今天的运动计划 周一:跑步 周二:篮球 周三:慢走 周四:动感单车 周-程序员宅基地

基础知识练习案例:减肥计划输入星期数,显示今天的减肥活动。 周一跑步、周二游泳、周三慢走、周四动感单车、周五拳击、周六爬山、周日 吃一顿_输入星期数,显示今天的运动计划 周一:跑步 周二:篮球 周三:慢走 周四:动感单车 周

Wireguard各主流平台的配置教程_wireguard配置-程序员宅基地

WireGuard服务器的建立,可以使用NAS服务器端的Docker容器建立(威联通、群晖、Unraid均可以) ,或者使用云服务器建立,这里推荐使用腾讯云推出的lighthouse轻量级服务器,新用户65一年还是不错的,这里我选择的操作i系统是“Ubuntu20.04-Docker20”,具体操作可以参考“spoto”大佬的视频,这里就不再赘述。然后在官网下载安卓或者ios安装文件, 安装好后,打开WireGuard手机客户端,点击“+”号,选择“扫面二维码”即可。五、Ubuntu客户端的配置。_wireguard配置

哔哩哔哩mac客户端!亲测!支持big sur系统_mac小达人的博客-程序员宅基地

bilibili mac客户端是哔哩哔哩弹幕网在Mac平台上的Mac迷你播放客户端!小编亲测!bilibili mac客户端支持在macos 11 big sur和M1芯片电脑使用!很好的解决了Bilibili娱乐社区在Mac平台至今没有出品问题!- 迷你窗- 置顶功能- 无边框播放器- 分P支持- Mac / Win客户端- 快捷键哔哩哔哩mac客户端v1.0.4中文版:mac.orsoon.com/Mac/181647.html????复制扔浏览器...

大学生计算机基础大难,大学生计算机基础实训六样文-程序员宅基地

大学生计算机基础实训六样文 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!9.9 积分WORD的五个常用功能笫1章 Word文本输入方法 ?11.1拼音输入法:最常见的输入方法 -11.2五笔输入法:最普及的专业输入方法 -11. 3手写输入法:最方便的输入方法 -11.4输入生僻字: -11.4.1微软拼音手写输入 -11.4.2微软拼音输入 ..._计算机实训难吗

LoadRunner小技巧-程序员宅基地

目录(?)[-]录制脚本中包含中文,出现乱码怎么办?录制到的脚本是空白的插入文本检查点步骤时,使用web_reg_find,通常TextPfx和TextSfx中会包含双引号,需要进行转义(用斜杠),例如:使用web_image_check插入图片检查点时需要主要设置Run-Time Setting中的Enable Image and text check选项:性能测试往往需要准备大批量的数

Ajax 获取 JSON 数据填充 ECharts 折线图-程序员宅基地

效果图页面 HTML 代码引入 echarts.js 和 jquery.js 库脚本代码。<!DOCTYPE html><head> <title>echarts</title> <style> * { margin: 0%; padding: 0%; } html,body { width: 100%

推荐文章

热门文章

相关标签