[OD E 100] 生成哈夫曼树

题目

题目描述
给定长度为 n 的无序的数字数组,每个数字代表二叉树的叶子节点的权值,数字数组的值均大于等于 1 。请完成一个函数,根据输入的数字数组,生成哈夫曼树,并将哈夫曼树按照中序遍历输出。

为了保证输出的二叉树中序遍历结果统一,增加以下限制:又树节点中,左节点权值小于等于右节点权值,根节点权值为左右节点权值之和。当左右节点权值相同时,左子树高度高度小于等于右子树。

注意: 所有用例保证有效,并能生成哈夫曼树提醒:哈夫曼树又称最优二叉树,是一种带权路径长度最短的一叉树。

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

输入描述
例如:由叶子节点

5 15 40 30 10 

生成的最优二叉树如下图所示,该树的最短带权路径长度为

40 * 1 + 30 * 2 + 15 * 3 + 5 * 4 + 10 * 4 = 205

image-20231218210700458

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

示例1

输入
5
5 15 40 30 10

输出

40 100 30 60 15 30 5 15 10

思路(用到的知识点)

  1. 哈夫曼树就是最优二叉树(越大的节点越靠近根)
  2. 构造哈夫曼树的方法:
    • 每个节点作为只有一个节点的树,所有的节点是一个森林
    • 取出根最小的两个树,他们的根的和作为他们的父节点
    • 把这个父节点加入原来节点的森林
    • 继续循环执行上面两步,直到森林中只有一棵树,这个树就是我们构造的哈夫曼树
  3. 中序遍历的顺序(左-中-右)
  4. priroty_queue的构造
    [1] 模板三个参数
    	1)元素的类型
    	2) 组织元素的结构体,默认是vector
    	3) 比较大小的函数对象,默认是less(大顶对)
    [2] 模板的第三个参数:
    	1)要么是个仿函数类型
    	2)要么是lambda类型,此时要把lambda对象作为初始化参数传入
    

代码

#include <iostream>
#include <queue>
#include <string>

using namespace std;

class Node
{
public:
    int val;
    Node *left;
    Node *right;
    int height;
    Node(int v) : val(v)
    {}
};

// struct Compare
// {
//     bool operator()(const Node *a, const Node *b)
//     {
//         if (a->val != b->val)
//         {
//             return a->val > b->val;
//         }
//         else
//         {
//             return a->height > b->height;
//         }
//     }
// };

auto compare = [](const Node *a, const Node *b)
{
    if (a->val != b->val)
    {
        return a->val > b->val;
    }
    else
    {
        return a->height > b->height;
    }
};

void inorder_traversal(Node *root, string &str)
{
    if (!root)
    {
        return;
    }

    inorder_traversal(root->left, str);
    str += to_string(root->val);
    str += ' ';
    inorder_traversal(root->right, str);
}

int main()
{
    int n;
    cin >> n;
    // priority_queue<Node *, vector<Node *>, Compare> pq;
    priority_queue<Node *, vector<Node *>, decltype(compare)> pq(compare);

    int item;
    while (n-- > 0)
    {
        cin >> item;
        Node *tmp = new Node(item);
        pq.push(tmp);
    }

    int height = 1;
    while (pq.size() != 1)
    {
        Node *pstNode1 = pq.top();
        pq.pop();
        Node *pstNode2 = pq.top();
        pq.pop();

        Node *parent = new Node(pstNode1->val + pstNode2->val);
        parent->height = height++;
        parent->left = pstNode1;
        parent->right = pstNode2;
        pq.push(parent);
    }

    Node *root = pq.top();

    string ans;
    inorder_traversal(root, ans);
    ans.pop_back();
    
    cout << ans << endl;

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/973567.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux-ubuntu系统移植之Uboot启动流程

Linux-ubuntu系统移植之Uboot启动流程 一&#xff0c;Uboot启动流程1.Uboot的两阶段1.1.第一阶段1.11.硬件初始化1.12.复制 U-Boot 到 RAM1.13.跳转到第二阶段 1.2.第二阶段1.21.C 语言环境初始化1.22. 硬件设备初始化1.23. 加载环境变量1.24. 显示启动信息1.25. 等待用户输入&…

ElasticSearch公共方法封装

业务场景 1、RestClientBuilder初始化&#xff08;同时支持单机与集群&#xff09; 2、发送ES查询请求公共方法封装&#xff08;支持sql、kql、代理访问、集群访问、鉴权支持&#xff09; 3、判断ES索引是否存在&#xff08;/_cat/indices/${indexName}&#xff09; 4、判断ES…

vertical-align

属性名&#xff1a; vertical - align 。 作用&#xff1a;用于指定 同一行元素之间 &#xff0c;或 表格单元格 内文字的 垂直对齐方式 。 常用值&#xff1a; 1. baseline &#xff08;默认值&#xff09;&#xff1a;使元素的基线与父元素的基线对齐。 2. top …

Markdown 与富文本语法对照全解析

原文&#xff1a;Markdown 与富文本语法对照全解析 | w3cschool笔记 Markdown 和富文本是两种广泛应用的文本格式。Markdown 以简洁易读的语法著称&#xff0c;而富文本则凭借其丰富的样式和强大的功能深受用户喜爱。本文将对 Markdown 和富文本的语法进行详细对照&#xff0c…

基于Django快递物流管理可视化分析系统(完整系统源码+数据库+详细开发文档+万字详细论文+答辩PPT+详细部署教程等资料)

文章目录 基于Django快递物流管理可视化分析系统&#xff08;完整系统源码数据库详细开发文档万字详细论文答辩PPT详细部署教程等资料&#xff09;一、项目概述二、项目说明三、研究意义四、系统设计技术架构 五、功能实现六、完整系统源码数据库详细开发文档万字详细论文答辩P…

vmvare kali如何配置桥接模式进行上网

注意点:虚拟机可以PING通物理机,但是PING不通其他的网站。经过收集资料,得知由于是校园网连接,所以DHCP只能分配一个授权的IP地址给连接的主机,由于KALI是桥接物理机,物理机已经获得了这个授权的IP,所以导致桥接的虚拟机无法上网。所以不是因为配置的有问题,而是网络的…

【数据挖掘】--算法

【数据挖掘】--算法 目录&#xff1a;1. 缺失值和数值属性处理1缺失值处理&#xff1a; 2. 用于文档分类的朴素贝叶斯3. 分治法&#xff1a;建立决策树4. 覆盖算法建立规则5. 挖掘关联规则6. 线性模型有效寻找最近邻暴力搜索&#xff08;Brute-Force Search&#xff09;kd树&am…

【数据库系统概论】第6章 (三)数据依赖的公理系统

推理规则 定理 函数依赖的其他五条推理规则。 (1) A4&#xff08;合并性规则&#xff09;&#xff1a;&#xff5b;X→Y&#xff0c;X→Z&#xff5d;| X→YZ。 (2) A5&#xff08;分解性规则&#xff09;&#xff1a;&#xff5b;X→Y&#xff0c;Z  Y&#xff5d;| X→Z …

1.22作业

1 Web-php-unserialize __construct()与$file、__destruct() __wakeup()检查 先绕过wakeup函数&#xff1a; O:4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";}1.PHP序列化的时候对public protected private变量的处理方式是不同的 public无标…

IDEA + 通义灵码AI程序员:快速构建DDD后端工程模板

作者&#xff1a;陈荣健 IDEA 通义灵码AI程序员&#xff1a;快速构建DDD后端工程模板 在软件开发过程中&#xff0c;一个清晰、可维护、可扩展的架构至关重要。领域驱动设计 (DDD) 是一种软件开发方法&#xff0c;它强调将软件模型与业务领域紧密结合&#xff0c;从而构建更…

什么是矩阵账号?如何高效运营tiktok矩阵账号

‍‌​​‌‌​‌​‍‌​​​‌‌​​‍‌​​​‌​‌​‍‌​​‌​​‌​‍‌​‌‌​‌‌‌‍‌​‌​‌​​​‍‌​​‌​‌‌​‍‌​​​​‌‌​‍‌​‌​​‌‌‌‍‌​​‌‌​‌​‍‌​‌​​‌‌‌‍‌​‌‌‌​​‌‍‌‌​​‌‌‌​‍‌‌​​‌‌​​‍‌…

用JMeter给要登录的操作做压力测试

压力测试的http请求路径如下图 应当添加http Header Manager&#xff0c;设置登录凭证

【DeepSeek 行业赋能】从金融到医疗:探索 DeepSeek 在垂直领域的无限潜力

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

【CSP/信奥赛通关课(一):C++语法基础】

CSP/信奥赛通关课&#xff08;一&#xff09;&#xff1a;C语法基础 课程简介&#xff1a; 通过六大模块&#xff08;基础入门、顺序结构、选择结构、循环结构、数组、函数&#xff09;&#xff0c;讲解CSP/信奥赛C语法基础&#xff0c;以模块化思想让学生入门C代码编程学习。 …

Web 自动化测试提速利器:Aqua 的 Web Inspector (检查器)使用详解

Web 自动化测试提速利器&#xff1a;Aqua 的 Web Inspector &#xff08;检查器&#xff09;使用详解 前言简介一、安装二、Web Inspector 的使用2.1 获取元素定位器&#xff08;Locators&#xff09;2.2 将定位器添加到代码2.3 验证定位器2.4 处理 Frames (框架) 总结 前言 Je…

IDEA中查询Maven项目的依赖树

在Maven项目中&#xff0c;查看项目的依赖树是一个常见的需求&#xff0c;特别是当你需要了解项目中直接或间接依赖了哪些库及其版本时。你可以通过命令行使用Maven的dependency:tree插件来做到这一点。这个命令会列出项目中所有依赖的树状结构。 打开idea项目的终端&#xff…

大数据技术之HBase操作归纳

HBase基本命令总结表(实际操作方式) 进入Hbase&#xff1a;hbase shell 方式一&#xff1a;命令行窗口来操作HBase 1.通用性命令 version 版本信息 status 查看集群当前状态 whoami 查看登入者身份 help 帮助2.HBase DDL操作(对象级操作) 2.1、namespace命名空间(相当…

Java 大视界 -- 国际竞争与合作:Java 大数据在全球市场的机遇与挑战(94)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

1.16作业

1 进注册界面&#xff0c;第一次以为抓包选把isadmin ture了就好 第二次尝试&#xff0c;勾选is admin&#xff0c;有需要invitecode&#xff08;经典&#xff09; 2 p r**5 r**4 - r**3 r**2 - r 2023 q r**5 - r**4 r**3 - r**2 r 2023 n 25066797992811602609904…

MybatisPlus教程-从入门到进阶

前言 首先它是国产的&#xff0c;所以直接用官网的简介。 简介 MyBatis-Plus 是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 特性 无侵入&#xff1a;只做增强不做改变&#xff0c;引入它不会对现有…