华为OD机试 - 二维伞的雨滴效应(Python/JS/C/C++ 2024 E卷 200分)

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

普通的伞在二维平面世界中,左右两侧均有一条边,而两侧伞边最下面各有一个伞坠子,雨滴落到伞面,逐步流到伞坠处,会将伞坠的信息携带并落到地面,随着日积月累,地面会呈现伞坠的信息。

1、为了模拟伞状雨滴效应,用二叉树来模拟二维平面伞(如下图所示),现在输入一串正整数数组序列(不含0,数组成员至少是1个),若此数组序列是二叉搜索树的前序遍历结果,那么请输出一个返回值1,否则输出0。

2、同时请将此序列构成的伞状效应携带到地面的数组信息输出(左边伞坠信息,右边伞坠信息,详细参考示例图地面上的数字),若此树不存在左右坠,则对应位置返回0,。同时若非二叉排序树,那么左右伞坠信息也返回0。

在这里插入图片描述

二、输入描述

1个通过空格分割的整数序列字符串,数组不含0,数组成员至少1个,输入的数组的任意两个数字都互不相同,最多1000个
正整数,正整数取值范围1~65535。

三、输出描述

输出如下三个值,以空格分割:是否是二叉排序树,左侧地面呈现的伞坠数字值,右侧地面呈现的伞坠数字值。
若是二叉排序树,则输出1,否则输出0。

若不存在左侧或右侧伞坠值,那么对应伞坠值直接输出0。

四、测试用例

1、输入

6 4 3 5 8 7 9 10

2、输出

1 3 10

3、说明

6 4 3 5 8 7 9 10能够组成一个二叉搜索树,输出左侧地面呈现的伞坠数字值3,右侧地面呈现的伞坠数字值10。

五、解题思路

二叉搜索树又称二叉排序树,具有以下性质:

  1. 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值;
  2. 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值;
  3. 它的左右子树也分别为二叉搜索树;

二叉搜索树就不能插入重复的元素了,且每次插入都是插入到叶子节点的位置。

插入的元素比当前位置元素小就往左走,比当前位置元素大就往右走,直到为空。

六、Python算法源码

class TreeNode:def __init__(self, value):self.value = valueself.left = Noneself.right = Nonedef main():arr = list(map(int, input().split()))  # 输入节点值root = TreeNode(arr[0])  # 第一个节点为根节点deque = []  # 模拟双端队列deque.append(root)pre_node = TreeNode(-1)  # 当前节点的前一个节点flag = True  # 是否满足二叉搜索树属性# 判断并构造二叉搜索树for i in range(1, len(arr)):node = deque[-1]current_node = TreeNode(arr[i])# 前一个节点的值小于当前节点的值while deque and deque[-1].value < current_node.value:node = deque.pop()if deque:pre_node = deque[-1]# 小的值放在左子树if node.value < current_node.value:node.right = current_nodepre_node = nodeelse:# 不满足二叉搜索树属性直接跳出if current_node.value < pre_node.value:flag = Falsebreaknode.left = current_nodedeque.append(current_node)# 如果满足二叉搜索树特性,获取左子树的最左节点,右子树的最右节点if flag:left_node = rootwhile left_node.left or left_node.right:if left_node.left:left_node = left_node.leftelse:left_node = left_node.rightright_node = rootwhile right_node.left or right_node.right:if right_node.right:right_node = right_node.rightelse:right_node = right_node.leftprint(f"1 {0 if left_node.value == root.value else left_node.value} {0 if right_node.value == root.value else right_node.value}")else:print("0 0 0")if __name__ == "__main__":main()

七、JavaScript算法源码

class TreeNode {constructor(value) {this.value = value;  // 节点的值this.left = null;    // 左子节点this.right = null;   // 右子节点}
}function main() {// 读取输入,将输入的字符串按空格分割,并转换为数字数组const input = prompt("Enter node values:").trim().split(" ").map(Number);const root = new TreeNode(input[0]); // 第一个节点为根节点const deque = []; // 用数组模拟双端队列deque.push(root); // 将根节点加入队列let preNode = new TreeNode(-1); // 当前节点的前一个节点,初始化为值为 -1 的节点let flag = true; // 是否满足二叉搜索树属性// 遍历输入数组,构造二叉搜索树for (let i = 1; i < input.length; i++) {let node = deque[deque.length - 1];  // 获取队列的最后一个节点,作为当前节点的前一个节点const currentNode = new TreeNode(input[i]); // 创建当前节点// 当队列不为空且前一个节点的值小于当前节点的值时while (deque.length > 0 && deque[deque.length - 1].value < currentNode.value) {node = deque.pop(); // 从队列中移除并获取最后一个节点if (deque.length > 0) {preNode = deque[deque.length - 1]; // 更新前一个节点}}// 当前节点的值大于前一个节点的值,添加到右子树if (node.value < currentNode.value) {node.right = currentNode; // 设置右子节点preNode = node; // 更新前一个节点} else {// 如果当前节点的值小于前一个节点的值,不满足二叉搜索树属性,设置 flag 为 false 并退出循环if (currentNode.value < preNode.value) {flag = false;break;}node.left = currentNode; // 设置左子节点}deque.push(currentNode); // 将当前节点加入队列}// 如果满足二叉搜索树特性,获取左子树的最左节点和右子树的最右节点if (flag) {let leftNode = root; // 从根节点开始while (leftNode.left !== null || leftNode.right !== null) {leftNode = leftNode.left !== null ? leftNode.left : leftNode.right; // 找到最左边的节点}let rightNode = root; // 从根节点开始while (rightNode.left !== null || rightNode.right !== null) {rightNode = rightNode.right !== null ? rightNode.right : rightNode.left; // 找到最右边的节点}// 输出结果,1 表示符合二叉搜索树,输出左子树的最左节点和右子树的最右节点的值console.log(`1 ${leftNode.value === root.value ? 0 : leftNode.value} ${rightNode.value === root.value ? 0 : rightNode.value}`);} else {// 如果不满足二叉搜索树特性,输出 "0 0 0"console.log("0 0 0");}
}main(); // 调用主函数

八、C算法源码

#include <stdio.h>
#include <stdlib.h>// 定义二叉树节点结构
typedef struct TreeNode {int value;  // 节点的值struct TreeNode *left;  // 左子节点struct TreeNode *right; // 右子节点
} TreeNode;// 创建新节点
TreeNode* createNode(int value) {TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode)); // 分配内存newNode->value = value;  // 设置节点值newNode->left = NULL;    // 初始化左子节点为空newNode->right = NULL;   // 初始化右子节点为空return newNode;
}// 将节点压入栈
void push(TreeNode** stack, int* size, TreeNode* node) {stack[(*size)++] = node;
}// 从栈中弹出节点
TreeNode* pop(TreeNode** stack, int* size) {return stack[--(*size)];
}// 获取栈顶节点
TreeNode* peek(TreeNode** stack, int size) {return stack[size - 1];
}int main() {int n, i, flag = 1;scanf("%d", &n); // 读取输入的节点数量int arr[n];for (i = 0; i < n; i++) {scanf("%d", &arr[i]); // 读取每个节点的值}TreeNode* root = createNode(arr[0]); // 第一个节点为根节点TreeNode* stack[1000]; // 模拟栈int stackSize = 0;push(stack, &stackSize, root); // 将根节点压入栈TreeNode* preNode = createNode(-1); // 当前节点的前一个节点,初始化为 -1for (i = 1; i < n; i++) {TreeNode* node = peek(stack, stackSize); // 获取栈顶节点TreeNode* currentNode = createNode(arr[i]); // 创建当前节点// 当栈不为空且栈顶节点的值小于当前节点的值时while (stackSize > 0 && peek(stack, stackSize)->value < currentNode->value) {node = pop(stack, &stackSize); // 弹出栈顶节点if (stackSize > 0) {preNode = peek(stack, stackSize); // 更新前一个节点}}// 当前节点的值大于前一个节点的值,添加到右子树if (node->value < currentNode->value) {node->right = currentNode; // 设置右子节点preNode = node; // 更新前一个节点} else {// 如果当前节点的值小于前一个节点的值,不满足二叉搜索树属性,设置 flag 为 0 并退出循环if (currentNode->value < preNode->value) {flag = 0;break;}node->left = currentNode; // 设置左子节点}push(stack, &stackSize, currentNode); // 将当前节点压入栈}// 如果满足二叉搜索树特性,获取左子树的最左节点和右子树的最右节点if (flag) {TreeNode* leftNode = root; // 从根节点开始while (leftNode->left != NULL || leftNode->right != NULL) {leftNode = (leftNode->left != NULL) ? leftNode->left : leftNode->right; // 找到最左边的节点}TreeNode* rightNode = root; // 从根节点开始while (rightNode->left != NULL || rightNode->right != NULL) {rightNode = (rightNode->right != NULL) ? rightNode->right : rightNode->left; // 找到最右边的节点}// 输出结果,1 表示符合二叉搜索树,输出左子树的最左节点和右子树的最右节点的值printf("1 %d %d\n", (leftNode->value == root->value ? 0 : leftNode->value),(rightNode->value == root->value ? 0 : rightNode->value));} else {// 如果不满足二叉搜索树特性,输出 "0 0 0"printf("0 0 0\n");}return 0;
}

九、C++算法源码

#include <iostream>
#include <deque>
#include <string>
#include <sstream>using namespace std;// 定义二叉树节点结构
struct TreeNode {int value; // 节点的值TreeNode* left;  // 左子节点TreeNode* right; // 右子节点// 构造函数初始化节点值和左右子节点TreeNode(int val) : value(val), left(nullptr), right(nullptr) {}
};int main() {string input;getline(cin, input);  // 读取一整行输入,将其存储在 `input` 字符串中istringstream ss(input);  // 使用 `istringstream` 解析输入字符串int num;ss >> num;  // 读取第一个数字作为根节点的值TreeNode* root = new TreeNode(num);  // 创建根节点deque<TreeNode*> deque;  // 使用双端队列来存储节点,模拟栈deque.push_back(root);  // 将根节点加入队列TreeNode* preNode = new TreeNode(-1);  // 当前节点的前一个节点,初始化为值为 -1 的节点bool flag = true;  // 用于判断是否满足二叉搜索树属性// 逐个读取输入的剩余数字,构造二叉搜索树while (ss >> num) {TreeNode* node = deque.back();  // 获取队列的最后一个节点,作为当前节点的前一个节点TreeNode* currentNode = new TreeNode(num);  // 创建当前节点// 当队列不为空且队列末尾节点的值小于当前节点的值while (!deque.empty() && deque.back()->value < currentNode->value) {node = deque.back();  // 更新当前节点为队列末尾节点deque.pop_back();  // 从队列中移除末尾节点if (!deque.empty()) {preNode = deque.back();  // 更新前一个节点为队列新的末尾节点}}// 如果当前节点的值大于前一个节点的值,添加到右子树if (node->value < currentNode->value) {node->right = currentNode;  // 设置右子节点preNode = node;  // 更新前一个节点} else {// 如果当前节点的值小于前一个节点的值,不满足二叉搜索树属性if (currentNode->value < preNode->value) {flag = false;  // 设置 flag 为 false,表示不满足二叉搜索树break;  // 退出循环}node->left = currentNode;  // 设置左子节点}deque.push_back(currentNode);  // 将当前节点加入队列}// 如果满足二叉搜索树特性,获取左子树的最左节点和右子树的最右节点if (flag) {TreeNode* leftNode = root;  // 从根节点开始while (leftNode->left != nullptr || leftNode->right != nullptr) {// 找到最左边的节点leftNode = (leftNode->left != nullptr) ? leftNode->left : leftNode->right;}TreeNode* rightNode = root;  // 从根节点开始while (rightNode->left != nullptr || rightNode->right != nullptr) {// 找到最右边的节点rightNode = (rightNode->right != nullptr) ? rightNode->right : rightNode->left;}// 输出结果,1 表示符合二叉搜索树,输出左子树的最左节点和右子树的最右节点的值cout << "1 " << (leftNode->value == root->value ? 0 : leftNode->value) << " " << (rightNode->value == root->value ? 0 : rightNode->value) << endl;} else {// 如果不满足二叉搜索树特性,输出 "0 0 0"cout << "0 0 0" << endl;}return 0;
}

🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ClickHouse-Kafka Engine 正确的使用方式

Kafka 是大数据领域非常流行的一款分布式消息中间件&#xff0c;是实时计算中必不可少的一环&#xff0c;同时一款 OLAP 系统能否对接 Kafka 也算是考量是否具备流批一体的衡量指标之一。ClickHouse 的 Kafka 表引擎能够直接与 Kafka 系统对接&#xff0c;进而订阅 Kafka 中的 …

镀金引线---

一、沉金和镀金 沉金和镀金都是常见的PCB金手指处理方式&#xff0c;它们各有优劣势&#xff0c;选择哪种方式取决于具体的应用需求和预算。 沉金&#xff08;ENIG&#xff09;是一种常用的金手指处理方式&#xff0c;它通过在金手指表面沉积一层金层来提高接触性能和耐腐蚀性…

【C++】模拟实现vector

在上篇中我们已经了解过的vector各种接口的功能使用&#xff0c;接下来我们就试着模拟实现一下吧&#xff01; 注意&#xff1a;我们在此实现的和C标准库中实现的有所不同&#xff0c;其目的主要是帮助大家大概理解底层原理。 我们模拟vector容器的大致框架是&#xff1a; t…

2024年【四川省安全员B证】新版试题及四川省安全员B证考试试卷

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 四川省安全员B证新版试题参考答案及四川省安全员B证考试试题解析是安全生产模拟考试一点通题库老师及四川省安全员B证操作证已考过的学员汇总&#xff0c;相对有效帮助四川省安全员B证考试试卷学员顺利通过考试。 1、…

【webpack4系列】webpack基础用法(二)

文章目录 entryoutputloaderpluginmode前端构建基础配置关联HTML插件html-webpack-plugin构建 CSS 解析 ES6和React JSX解析 ES6解析 React JSX 解析CSS、Less和Sass解析CSS解析Less解析sass 解析图片和字体资源解析&#xff1a;解析图片资源解析&#xff1a;解析字体资源解析&…

JS - 获取剪切板内容 Clipboard API

目录 1&#xff0c;需求最终效果 2&#xff0c;实现示例 3&#xff0c;注意点1&#xff0c;只支持安全上下文环境2&#xff0c;只能读取当前页面的剪切板3&#xff0c;权限获取问题4&#xff0c;获取内容的 MIME_TYPE 问题1&#xff0c;文本内容2&#xff0c;图片内容 5&#x…

魅思-视频管理系统 getOrderStatus SQL注入漏洞复现

0x01 产品简介 魅思-视频管理系统是一款集成了视频管理、用户管理、手机端应用封装等功能的综合性视频管理系统。该系统不仅以其强大的视频管理功能、灵活的用户管理机制、便捷的手机端应用封装功能以及高安全性和现代化的界面设计,成为了市场上备受关注的视频管理系统之一。…

一个基于 laravel 和 amis 开发的后台框架, 友好的组件使用体验,可轻松实现复杂页面(附源码)

前言 随着互联网应用的发展&#xff0c;后台管理系统的复杂度不断增加&#xff0c;对于开发者而言&#xff0c;既要系统的功能完备&#xff0c;又要追求开发效率的提升。然而&#xff0c;传统的开发方式往往会导致大量的重复劳动&#xff0c;尤其是在构建复杂的管理页面时。有…

Web植物管理系统-下位机部分

本节主要展示上位机部分&#xff0c;采用BSP编程&#xff0c;不附带BSP中各个头文件的说明&#xff0c;仅仅是对main逻辑进行解释 main.c 上下位机通信 通过串口通信&#xff0c;有两位数据验证头&#xff08;verify数组中保存对应的数据头 0xAA55) 通信格式 上位发送11字节…

机器学习:opencv--图像金字塔

目录 一、图像金字塔 1.图像金字塔是什么&#xff1f; 2.有哪些常见类型&#xff1f; 3.金字塔的构建过程 4.图像金字塔的作用 二、图像金字塔中的操作 1.向下采样 2.向上采样 3.注意--无法复原 三、代码实现 1.高斯金字塔向下采样 2.高斯金字塔向上采样 3.无法复…

基于SpringBoot+Vue+MySQL的志愿服务管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着社会对志愿服务需求的日益增长&#xff0c;传统的志愿服务管理方式已难以满足高效、透明、精准的管理需求。为提升志愿服务组织的运营效率&#xff0c;优化资源配置&#xff0c;增强志愿者参与度和满意度&#xff0c;开发基…

LinuxC高级作业1

1.已知网址www.hqyj.com截取出网址的每一个部分 2.整理思维导图 3.将配置桥接网络的过程整理成文档 i)) 保证虚拟机提供了桥接模式 菜单栏中 ----> 虚拟机 -----> 设置 -----> 网络适配器 ii) 保证虚拟机可以设置桥接网络 菜单栏中 ----> 编辑 -----> 虚拟网…

linux第一课(操作系统核心)

一.关于linux (1)linux是一款开源的操作系统(是多用户&#xff0c;多任务&#xff0c;多线程)。 (2)一般所说的linux指的是linux核心&#xff0c;即对计算机硬件资源负责调度管理&#xff0c;主要职责是进程管理&#xff0c;内存管理文件系统&#xff0c;设备驱动&#xff0c…

禹神3小时快速上手typescript

一、TypeScript简介 TypeScript 由微软开发&#xff0c;是基于 JavaScript 的⼀个扩展语⾔。TypeScript 包含了 JavaScript 的所有内容&#xff0c;即&#xff1a; TypeScript 是 JavaScrip t 的超集。TypeScript 增加了&#xff1a;静态类型检查、接⼝、 泛型等很多现代开发特…

(计算机毕设)基于SpringBoot+Vue的“乐锄”农产品销售网站的设计与实现

毕业设计&#xff08;论文&#xff09; 博主可接毕设&#xff01;&#xff01;&#xff01; 基于SpringBootVue的“乐锄”农产品销售网站的设计与实现 摘 要 传统的农资采购销售模式&#xff0c;造成农业生产的效率和质量低&#xff0c;人们对食品安全问题关注不断增加&#x…

golang 字符串浅析

go的字符串是只读的 测试源代码 package mainimport ("fmt""unsafe" )func swap(x, y string) (string, string) {return y, x }func print_string(obj *string, msg string) {string_ptr : (*[2]uintptr)(unsafe.Pointer(obj))first_obj_addr : string_…

前后端分离,使用MOCK进行数据模拟开发,让前端攻城师独立于后端进行开发

mock是什么 Mock生成随机数据,拦截Ajax 请求&#xff0c;前后端分离&#xff0c;让前端攻城师独立于后端进行开发。 增加单元测试的真实性 通过随机数据,模拟各种场景。 在实际开发过程中&#xff0c;前端是通过axios来请求数据的&#xff0c;很多时候前端开发者就是通过写固定…

1.Seata 1.5.2 seata-server搭建

一&#xff1a;Seata基本介绍 Seata是一款开源的分布式事务解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 详见官网链接&#xff1a;https://seata.apache.org/zh-cn/ 1.历史项目里的使用经验&#xff1a; 之前公司里的oem用户对应的App…

C# 修改项目类型 应用程序程序改类库

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

Docker学习笔记(四)单主机网络

简介 Docker从容器中抽象除出了底层的主机连接网络&#xff0c;使得程序不用关心运行时的环境。连接到Docker网络的容器将获得唯一的地址&#xff0c;其他连接到同一Docker网络的容器也可以根据该IP找到目标容器并发送消息。   但是容器内运行的软件没法方便的确定主机IP地址…