20240904 华为笔试 二叉树消消乐

ops/2024/10/10 17:56:05/

文章目录

  • 题目
  • 解题思路
  • 代码
    • BUG 代码
    • 最终代码

题目

  • 题目描述
    给定原始二叉树和参照二叉树(输入的二叉树均为满二叉树,二叉树节点的值范围为[1,1000],二叉树的深度不超过1000),现对原始二叉树和参照二又树中相同层级目值相同的节点进行消除,消除规则为原始二叉树和参照二又树中存在多个值相同的节点只能消除等数量的,消除后的节点变为无效节点,请按节点值出现频率从高到低输出消除后原始二叉树中有效节点的值(如果原始二叉树消除后没有有效节点返回0)。
  • 解答要求
    时间限制: C/C++ 1000ms, 其他语言:2000ms
    内存限制: C/C++256MB,其他语言:512MB
  • 输入
    原始二叉树中的节点个数
    原始二叉树
    参照二叉树中的节点个数
    畚照二叉树
  • 输出
    原始二叉树中有效节点的值,按出现频率从高到低排序(相同频率的值按大小排序),相同频率的值按降序排列。
  • 样例1
    输入:
    7
    1 3 3 3 4 5 6
    3
    2 3 4
    输出:
    36541
    解释:
    原始二叉树A消除参照二叉树B中的重复元素后,有效节点剩余2个3,1个6,1个5,1个4,1个1,3出现的频率2,6、5、4、1出现的频率为1,按值从大到小排序,所以排序结果为36541。
    在这里插入图片描述
  • 样例2
    输入:
    15
    5 6 6 6 7 7 7 8 8 9 9 7 7 5 6
    7
    5 6 6 7 7 8 8
    输出:
    79865
    解释:
    原始二叉树A消除参照二叉树B中的重复元素后,有效节点剩余3个7,2个9,2个8,2个6,1个5,8出现的频率为3,7出现的频率为2,6出现的频率为2,6的值比5大,所以排序结果为79865
    在这里插入图片描述
  • 样例3
    输入:
    7
    1 3 4 3 2 2 6
    3
    2 4 3
    输出:
    2631
    解释:
    原始二叉树A消除参照二叉树B中的重复元素后,有效节点剩余2个2,1个6,1个3,1个1;2出现的频率2,6、3、1出现的频率为1,按值从大到小排序,所以排序结果为2631。
    在这里插入图片描述

解题思路

  • main 函数内分别 构造两个 vector 存入原始二叉树和参照二叉树的信息 ,构造1个结果map表示原始参考树剩余有效节点及其数量,初始化层数 n2=0。
  • 遍历提取出原始二叉树和参考二叉树每一层的数据
    对二叉树的第i个元素进行遍历,判断当前元素是否是该层的首元素(i==pow(2,n2-1)),若不是则继续遍历;若该元素是该层的首元素,则 提取出原始二叉树和参考二叉树中该层的所有元素,分别存入两个 map,表示该层节点的数值及其数量。
    遍历参考树该层的节点,对原始树该层的数据抵消,最后存储剩余节点及数量
    对参考树该层的数据进行遍历,并在原始二叉树中查找该数据,若能找到,则把该数据在原始二叉树这一层的数量 减去 在参考二叉树这一层的数量。
    对原始参考树该层的数据进行遍历,若该数据的数量大于0,则表示该数据为有效节点,则将该数据及其数量存入结果map中。该层处理结束后,将层数n2++,继续遍历下一个节点i+1的元素。
  • 若结果中有效节点数为空则直接输出0,否则按照节点数和节点数值排序输出
    构造1个vector用于排序,vector中的每一个元素都是一个 pair<int,int> ,表示剩余有效节点及其数量。构造1个排序规则函数对这个vector进行排序:若节点数相同则按照节点数值排序,否则按照节点数量排序。

代码

BUG 代码

  • BUG 代码:没有考虑样例3这样的情况,该代码只是按照相同位置的相同元素进行了抵消,应当按照每一层的相同元素进行抵消。
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>using namespace std;bool compare(const pair<int, int>& a, const pair<int, int>& b) {if (a.second == b.second) {return a.first > b.first; //相同频率时,按值降序排序}return a.second > b.second;   //按频率降排序
}int main() {int n, m;vector<int> res_vec;cin >> n;vector<int> n_vec(n);for (int i = 0; i < n; ++i) {cin >> n_vec[i];}cin >> m;vector<int> m_vec(m);for (int i = 0; i < m; ++i) {cin >> m_vec[i

http://www.ppmy.cn/ops/123600.html

相关文章

Git初识

Git仓库 Git概念&#xff1a;一个免费开源&#xff0c;分布式的代码版本控制系统&#xff0c;帮助开发团队维护代码 作用&#xff1a;记录代码内容&#xff0c;切换代码版本&#xff0c;多人开发时高效合并代码内容 Git仓库&#xff1a;记录文件状态内容的地方&#xff0c;存…

在使用visual studio 2022,运行程序时弹窗:“ 此任务要求应用程序具有提升的权限“

系列文章目录 文章目录 系列文章目录前言一、问题原因二、解决方法1.第一种解决方法2.第二种解决方法 前言 在使用visual studio 2022&#xff0c;运行程序时弹窗&#xff1a;" 此任务要求应用程序具有提升的权限"&#xff0c;每次都要再次点击“使用其他凭证重新启…

基于阻塞队列及环形队列的生产消费模型

目录 条件变量函数 等待条件满足 阻塞队列 升级版 信号量 POSIX信号量 环形队列 条件变量函数 等待条件满足 int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex); 参数&#xff1a; cond&#xff1a;要在这个条件变量上等待 mutex…

C++——继承

目录 引言 继承的概念和定义 1.继承的概念 2.继承的定义 2.1 继承的语法形式 2.2 继承中类的叫法 2.3 继承后的子类成员访问权限 基类与派生类的赋值转换 1.派生类对象赋值给基类对象 2.派生类对象的引用赋值给基类对象 3.派生类对象的指针赋值给基类对象 4.基类指…

jpa String index out of range: 0

ORM Spring Data Jpa 查询报错信息 原因&#xff1a;数据库字段设置为char类型&#xff0c;但是该字段为空字符串 参考&#xff1a;https://stackoverflow.com/questions/24380846/hibernate-sql-exception-java-lang-stringindexoutofboundsexception-string-index java.lang…

CentOS 7 上安装 Kibana

以下是在 CentOS 7 上安装 Kibana 的步骤&#xff1a; 一、安装 Java&#xff08;如果尚未安装&#xff09; Kibana 需要 Java 运行环境。如果系统中没有安装 Java&#xff0c;可以使用以下命令安装 OpenJDK&#xff1a; sudo yum install java-1.8.0-openjdk二、添加 Elast…

为什么numpy.array的数据像是字典一样,但是这个数据有real属性,又无法读取shape,显示0-d array

根据您提供的信息&#xff0c;您似乎在处理一个0维的NumPy数组&#xff0c;也称为标量。在NumPy中&#xff0c;0维数组是一个只有一个元素的数组&#xff0c;它没有行和列的结构&#xff0c;只包含一个值。这个值可以是任何数据类型&#xff0c;包括整数、浮点数或字符串。 当…

华为---MUX VLAN简介及示例配置

目录 1. 产生背景 2. 应用场景 3. 主要功能 4. 基本概念 5. 配置步骤及相关命令 6.示例配置 6.1 示例场景 6.2 网络拓扑图 6.3 配置代码 6.4 配置及解析 6.5 测试验证 配置注意事项 1. 产生背景 MUX VLAN&#xff08;Multiplex VLAN&#xff09;提供了一种通过VLA…