首页 > 编程语言 >2024年华为OD机试真题-生成哈夫曼树-(C++/Java/python)-OD统一考试(C卷D卷)

2024年华为OD机试真题-生成哈夫曼树-(C++/Java/python)-OD统一考试(C卷D卷)

时间:2024-06-22 22:58:33浏览次数:25  
标签:30 15 哈夫曼 OD 40 权值 Java 节点

题目描述

给定长度为 n 的无序的数字数组,每个数字代表二叉树的叶子节点的权值,数字数组的值均大于等于1。

请完成一个函数,根据输入的数字数组,生成哈夫曼树,并将哈夫曼树按照中序遍历输出。

为了保证输出的二叉树中序遍历结果统一,增加以下限制:

二叉树节点中,左节点权值小于右节点权值,根节点权值为左右节点权值之和。当左右节点权值相同时,左子树高度小于等于右子树高度。

注意:

所有用例保证有效,并能生成哈夫曼树。

提醒:

哈夫曼树又称为最优二叉树,是一种带权路径长度最短的二叉树。

所谓树的带权路径长度,就是树中所有的叶节点的权值乘上其到根节点的路径长度(若根节点为 0 层,叶节点到根节点的路径长度为叶节点的层数)

输入描述

例如:由叶子节点:5 15 40 30 10,生成的最优二叉树如下图所示,该树的最短带权路径长度为:40 * 1 + 30 * 2 + 15 * 3 + 5 * 4 + 10 * 4 = 205。

输出描述

输出一个哈夫曼树的中序遍历数组,数值间以空格分隔

用例1

输入

5

5 15 40 30 10

输出

40 100 30 60 15 30 5 15 10

说明

根据输入,生成哈夫曼树,按照中序遍历返回。所有节点中,左节点权值小于等于右节点权值之和。当左右节点权值相同时,左子树高度小于右子树。结果如上图所示。

解题思路

哈夫曼的构建是有固定思路:

首先,我们从给定的n个叶子节点的权值序列中取出最小的两个,

比如 [5, 15, 40, 30, 10] 中最小的两个是5、10,取出进行合并,则可得新节点15,

然后将新节点重新加入到权值序列中,得到新序列 [15, 15, 40, 30] 

然后再从新序列 [15, 15, 40, 30]中取出最小的两个,进行合并

然后再从新序列 [30, 40, 30]中取出最小的两个,进行合并

然后再从新序列 [60, 40]中取出最小的两个,进行合并

此时序列中只剩下一个节点,即可停止上面逻辑。

按照这种策略构造出来的二叉树的带权路径长度是最短的,即构建出来的是哈夫曼树。

了解了哈夫曼树的构造原理后,其实本题就很简单了,只需要不停从给定的权值序列中:

取出两个最小的权值

放回两个最小权值的合并和

直到权值序列中只有一个元素时停止。

而上面取出两个最小、返回合并和后重新排序,这种行为是非常适合使用优先队列(小顶堆)做的。

代码

标签:30,15,哈夫曼,OD,40,权值,Java,节点
From: https://blog.csdn.net/dijkstra2023/article/details/139809503

相关文章

  • 离线安装 VS Code Server
    离线安装VSCodeServerVSCode提供了两种连接服务器的方法,分别使用Remote-SSH和Remote-Tunnels插件。本文介绍使用Remote-SSH连接服务器。VSCode连接服务器安装Remote-SSH插件点击左侧的扩展按钮(或用Ctrl+Shift+X),搜索插件Remote-SSH进行安装离线安装VSCo......
  • java环境配置
    原文:https://edu.csdn.net/skill/java/java-4ddfc05dbbe54300905f404c1ed1b4f9?category=462&typeId=19824前言为什么写这篇文章呢,因为我不想再去百度搜别人的文章了,所以自己写一篇以作记录。一、准备工作JDK8下载地址JDK11下载地址在这里插入图片描述下载好之后双击exe文......
  • UNIQUE VISION Programming Contest 2024 Summer (AtCoder Beginner Contest 359) 题
    点我看题A-CountTakahashi没啥好说的点击查看代码#include<bits/stdc++.h>#definerep(i,n)for(inti=0;i<n;++i)#definerepn(i,n)for(inti=1;i<=n;++i)#defineLLlonglong#definefifirst#definesesecond#definepbpush_back#definemprmake_pair......
  • nvm管理node.js版本
    起因:自己在使用nodejs的时候经常遇到版本问题。每次手动重装更换版本觉得非常麻烦。之前在搭建静态博客的时候,遇到版本问题,生成出来博客静态页白屏。这个就是我部署在github上的静态博客:https://blog.xisoul.cn一、首先卸载Node.js1.打开控制面板锚点2.卸载程序3.找到Node......
  • java设计模式--装饰器模式
    装饰器模式是一种结构型设计模式,它允许你动态地向对象添加额外的行为。装饰器模式通过将对象包装在一个装饰器类中,以提供额外的功能,而不是修改原始对象的结构。装饰器模式主要解决的问题是在不改变现有对象结构的情况下,动态地添加功能或修改行为。它可以避免使用子类继承的方式引......
  • JAVA中的三大特殊类:抽象类,接口类,内部类(JAVA基础)
    抽象类1.抽象类包含抽象方法的类就是抽象类。通过abstract方法定义规范,然后要求子类必领定义具体实现。通过抽象类,我们就可以做到严格限制子类的设计,使子类之间更加通用2.抽象方法使用abstract修饰的方法,没有方法体,只有声明。定义的是一种“规范”,就是告诉子类必须要给抽象......
  • AtCoder Beginner Contest 359 解题报告
    AtCoderBeginnerContest359吐槽:A-F还算正常,G题你tm给我放了个出过的板子(ABC340G)是几个意思啊???ASimulate.#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#defineendl'\n'#definePBemplace_back#definePPBpop_back#defineMPmake_pai......
  • DRF 报错:RuntimeError: Model class django.contrib.contenttypes.models.ContentType
    该错误发生于将'django.contrib.contenttypes'注释之后该组件的功能见如下链接:https://www.cnblogs.com/xiugeng/p/9831665.htmldrf的APIView内部会走认证源码,相关代码导致的报错,怎么解决呢?就是在settings.py中配置上如下两个参数(匿名用户和认证)即可:https://www.cnblogs.com/N......
  • 简单整理一下近几年辅导的毕业设计项目Java+SSM+MySQL
    序号项目标题语言框架数据库代码论文PPT1jspm基于SSM的“昭愿”甜品店销售管理系统JavaSSMMySQL√√√2jspm基于SSM的医药管理系统JavaSSMMySQL√√√3jspm1x3v1基于JSP的校园宿舍电费缴纳系统JavaSSMMySQL√√√4jspm“众优”大学生家教平台的设计与实现JavaSSMMySQL√√√5......
  • 为什么JavaScript要书写优化?
    第一个原因:我们写代码是给机器看的,也是给程序员看的第二个原因:JS是弱类型语言,写得太随意编码风格就不好第三个原因:潜移默化提高程序性能那要怎么书写优化?要按强类型风格写代码varnum,str,obj;//没有指明类型varnumVal=0,strVal=......