华为OD机试真题 - 二叉树的广度优先遍历 - 二叉树(Python/JS/C/C++ 2024 D卷 200分)

在这里插入图片描述

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

专栏导读

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

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

一、题目描述

有一棵二叉树,每个节点由一个大写字母标识(最多26个节点)。

现有两组字母,分别表示后序遍历(左孩子->右孩子->父节点)和中序遍历(左孩子->父节点->右孩子)的结果,请输出层次遍历的结果。

二、输入描述

输入为两个字符串,分别是二叉树的后续遍历和中序遍历结果。

三、输出描述

输出二叉树的层次遍历结果。

四、测试用例

1、输入

CBEFDA CBAEDF

2、输出

ABDCEF

3、说明

二叉树为:
A
/
B D
/ /
C E F

五、解题思路

为了从后序遍历和中序遍历结果构建二叉树,然后输出层次遍历结果,我们可以按照以下步骤进行:

  1. 从后序遍历和中序遍历构建二叉树:
    • 后序遍历的最后一个节点是根节点。
    • 在中序遍历中找到该根节点,根节点左边的部分是左子树,右边的部分是右子树。
    • 递归地对左右子树重复上述过程,直到构建完整的二叉树。
  2. 进行层次遍历:
    • 使用队列进行层次遍历,从根节点开始,将每一层的节点加入队列,并依次输出。

六、Python算法源码

from collections import dequeclass TreeNode:def __init__(self, val):self.val = valself.left = Noneself.right = Nonedef build_tree(post_order, in_order):if not post_order or not in_order:return Nonereturn build_tree_helper(post_order, 0, len(post_order) - 1, in_order, 0, len(in_order) - 1)def build_tree_helper(post_order, post_start, post_end, in_order, in_start, in_end):if post_start > post_end or in_start > in_end:return None# 后序遍历的最后一个节点是根节点root_val = post_order[post_end]root = TreeNode(root_val)# 在中序遍历中找到根节点的位置root_index = in_order.index(root_val)# 计算左子树的大小left_tree_size = root_index - in_start# 构建左子树root.left = build_tree_helper(post_order, post_start, post_start + left_tree_size - 1, in_order, in_start, root_index - 1)# 构建右子树root.right = build_tree_helper(post_order, post_start + left_tree_size, post_end - 1, in_order, root_index + 1, in_end)return rootdef level_order_traversal(root):if root is None:return ""result = []queue = deque([root])while queue:current = queue.popleft()result.append(current.val)if current.left is not None:queue.append(current.left)if current.right is not None:queue.append(current.right)return ''.join(result)def main():# 读取输入的后序遍历和中序遍历字符串post_order = input("Enter post-order traversal: ")in_order = input("Enter in-order traversal: ")# 构建二叉树root = build_tree(post_order, in_order)# 输出层次遍历结果level_order_result = level_order_traversal(root)print(level_order_result)if __name__ == "__main__":main()

七、JavaScript算法源码

class TreeNode {constructor(val) {this.val = val;this.left = null;this.right = null;}
}function buildTree(postOrder, inOrder) {if (!postOrder || !inOrder || postOrder.length === 0 || inOrder.length === 0) {return null;}return buildTreeHelper(postOrder, 0, postOrder.length - 1, inOrder, 0, inOrder.length - 1);
}function buildTreeHelper(postOrder, postStart, postEnd, inOrder, inStart, inEnd) {if (postStart > postEnd || inStart > inEnd) {return null;}// 后序遍历的最后一个节点是根节点const rootVal = postOrder[postEnd];const root = new TreeNode(rootVal);// 在中序遍历中找到根节点的位置const rootIndex = inOrder.indexOf(rootVal);// 计算左子树的大小const leftTreeSize = rootIndex - inStart;// 构建左子树root.left = buildTreeHelper(postOrder, postStart, postStart + leftTreeSize - 1, inOrder, inStart, rootIndex - 1);// 构建右子树root.right = buildTreeHelper(postOrder, postStart + leftTreeSize, postEnd - 1, inOrder, rootIndex + 1, inEnd);return root;
}function levelOrderTraversal(root) {if (!root) {return "";}let result = "";const queue = [];queue.push(root);while (queue.length > 0) {const current = queue.shift();result += current.val;if (current.left !== null) {queue.push(current.left);}if (current.right !== null) {queue.push(current.right);}}return result;
}function main() {// 读取输入的后序遍历和中序遍历字符串const postOrder = prompt("Enter post-order traversal:");const inOrder = prompt("Enter in-order traversal:");// 构建二叉树const root = buildTree(postOrder, inOrder);// 输出层次遍历结果const levelOrderResult = levelOrderTraversal(root);console.log(levelOrderResult);
}// 调用 main 函数
main();

八、C算法源码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 定义二叉树节点结构体
typedef struct TreeNode {char val;struct TreeNode* left;struct TreeNode* right;
} TreeNode;// 创建新节点
TreeNode* createNode(char val) {TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));newNode->val = val;newNode->left = NULL;newNode->right = NULL;return newNode;
}// 根据后序遍历和中序遍历构建二叉树
TreeNode* buildTreeHelper(char* postOrder, int postStart, int postEnd, char* inOrder, int inStart, int inEnd) {if (postStart > postEnd || inStart > inEnd) {return NULL;}// 后序遍历的最后一个节点是根节点char rootVal = postOrder[postEnd];TreeNode* root = createNode(rootVal);// 在中序遍历中找到根节点的位置int rootIndex;for (rootIndex = inStart; rootIndex <= inEnd; rootIndex++) {if (inOrder[rootIndex] == rootVal) {break;}}// 计算左子树的大小int leftTreeSize = rootIndex - inStart;// 构建左子树root->left = buildTreeHelper(postOrder, postStart, postStart + leftTreeSize - 1, inOrder, inStart, rootIndex - 1);// 构建右子树root->right = buildTreeHelper(postOrder, postStart + leftTreeSize, postEnd - 1, inOrder, rootIndex + 1, inEnd);return root;
}// 根据后序遍历和中序遍历字符串构建二叉树
TreeNode* buildTree(char* postOrder, char* inOrder) {int len = strlen(postOrder);if (len == 0) {return NULL;}return buildTreeHelper(postOrder, 0, len - 1, inOrder, 0, len - 1);
}// 层次遍历二叉树并输出结果
void levelOrderTraversal(TreeNode* root) {if (root == NULL) {return;}TreeNode** queue = (TreeNode**)malloc(100 * sizeof(TreeNode*));int front = 0;int rear = 0;queue[rear++] = root;while (front < rear) {TreeNode* current = queue[front++];printf("%c", current->val);if (current->left != NULL) {queue[rear++] = current->left;}if (current->right != NULL) {queue[rear++] = current->right;}}free(queue);
}// 释放二叉树节点的内存
void freeTree(TreeNode* root) {if (root != NULL) {freeTree(root->left);freeTree(root->right);free(root);}
}int main() {char postOrder[100];char inOrder[100];// 读取输入的后序遍历和中序遍历字符串printf("Enter post-order traversal: ");scanf("%s", postOrder);printf("Enter in-order traversal: ");scanf("%s", inOrder);// 构建二叉树TreeNode* root = buildTree(postOrder, inOrder);// 输出层次遍历结果levelOrderTraversal(root);printf("\n");// 释放二叉树的内存freeTree(root);return 0;
}

九、C++算法源码

#include <iostream>
#include <queue>
#include <string>
#include <unordered_map>using namespace std;// 定义二叉树节点结构体
struct TreeNode {char val;TreeNode* left;TreeNode* right;TreeNode(char x) : val(x), left(nullptr), right(nullptr) {}
};// 根据后序遍历和中序遍历构建二叉树
TreeNode* buildTreeHelper(const string& postOrder, int postStart, int postEnd, const string& inOrder, int inStart, int inEnd, unordered_map<char, int>& inOrderMap) {if (postStart > postEnd || inStart > inEnd) {return nullptr;}// 后序遍历的最后一个节点是根节点char rootVal = postOrder[postEnd];TreeNode* root = new TreeNode(rootVal);// 在中序遍历中找到根节点的位置int rootIndex = inOrderMap[rootVal];// 计算左子树的大小int leftTreeSize = rootIndex - inStart;// 构建左子树root->left = buildTreeHelper(postOrder, postStart, postStart + leftTreeSize - 1, inOrder, inStart, rootIndex - 1, inOrderMap);// 构建右子树root->right = buildTreeHelper(postOrder, postStart + leftTreeSize, postEnd - 1, inOrder, rootIndex + 1, inEnd, inOrderMap);return root;
}// 根据后序遍历和中序遍历字符串构建二叉树
TreeNode* buildTree(const string& postOrder, const string& inOrder) {unordered_map<char, int> inOrderMap;for (int i = 0; i < inOrder.size(); ++i) {inOrderMap[inOrder[i]] = i;}return buildTreeHelper(postOrder, 0, postOrder.size() - 1, inOrder, 0, inOrder.size() - 1, inOrderMap);
}// 层次遍历二叉树并输出结果
void levelOrderTraversal(TreeNode* root) {if (root == nullptr) {return;}queue<TreeNode*> q;q.push(root);while (!q.empty()) {TreeNode* current = q.front();q.pop();cout << current->val;if (current->left != nullptr) {q.push(current->left);}if (current->right != nullptr) {q.push(current->right);}}
}// 释放二叉树节点的内存
void freeTree(TreeNode* root) {if (root != nullptr) {freeTree(root->left);freeTree(root->right);delete root;}
}int main() {string postOrder;string inOrder;// 读取输入的后序遍历和中序遍历字符串cout << "Enter post-order traversal: ";cin >> postOrder;cout << "Enter in-order traversal: ";cin >> inOrder;// 构建二叉树TreeNode* root = buildTree(postOrder, inOrder);// 输出层次遍历结果levelOrderTraversal(root);cout << endl;// 释放二叉树的内存freeTree(root);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/bicheng/53461.shtml

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

相关文章

(六十二)第 9 章 查找(开放定址哈希表)

示例代码 hashTable.h // 开放定址哈希表的存储结构实现头文件#ifndef HASH_TABLE_H #define HASH_TABLE_H#include "errorRecord.h"#define NULL_KEY -2 #define NUM 10#define SUCCESS 1 #define UNSUCCESS 0 #define DUPLICATE -1#define EQUAL(a, b) ((a) == (b)…

Github 2024-09-07Rust开源项目日报Top10

根据Github Trendings的统计,今日(2024-09-07统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10CUE项目1Python项目1Go项目1Polars: Rust中的DataFrame接口和OLAP查询引擎 创建周期:1354 天开发语言:Rust, Python协议类型:MIT …

Ubuntu之源码编译安装nginx

参考&#xff1a;Ubuntu之源码编译安装nginx_ubuntu编译安装nginx-CSDN博客 1.下载源码后进入源码目录&#xff0c;如下&#xff1a; cd /home/jq/wf/nginx-1.26.1 2.下载相应依赖库&#xff1a; apt-get install libpcre3-dev apt-get install openssl libssl-dev apt-get…

基于STM32设计的ECG+PPG人体参数测量系统(华为云IOT)(217)

文章目录 一、前言1.1 项目介绍【1】开发背景【2】项目实现的功能【3】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】整体构架【3】上位机开发思路【4】ESP8266工作模式配置1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】摘要【5】项目背景1.4 开发…

神经网络骨架nn.Module

文章目录 一、认识nn.Module二、nn.Module的基础加1操作 一、认识nn.Module nn.Module 是 PyTorch 中的一个核心类&#xff0c;它是所有神经网络模块的基类。在 PyTorch 中构建模型时&#xff0c;通常会继承这个类来创建自定义的网络结构。nn.Module 提供了一系列用于构建神经…

MATLAB 中的矩阵切片操作详解(细节无敌)

在 MATLAB 中&#xff0c;矩阵切片&#xff08;Matrix Slicing&#xff09;是一种非常常用的操作&#xff0c;用于从矩阵或数组中提取子集。这种操作非常灵活&#xff0c;可以通过指定行和列的索引来获取子矩阵。矩阵切片在数据处理、算法设计、图像处理等许多领域都非常有用。…

QT中tr的作用是什么

在Qt框架中&#xff0c;tr() 函数是一个非常重要的宏&#xff0c;它用于国际化和本地化&#xff08;i18n和l10n&#xff09;支持。tr() 函数使得Qt应用程序能够根据不同的语言环境&#xff08;locale&#xff09;显示相应的翻译文本&#xff0c;从而支持多种语言。 具体来说&a…

如何在Word中插入复选框

如何在Word中插入复选框&#xff1a;详细教程与技巧 在Word中插入复选框是一项非常实用的技巧&#xff0c;尤其是在制作问卷调查、待办事项清单、交互式表单或文档中需要用户进行选择时&#xff0c;复选框不仅能提高文档的功能性&#xff0c;还能显得更加专业。本文将详细讲解…

2024 年高教社杯全国大学生数学建模竞赛 C 题 农作物的种植策略 完整参考论文

持续更新中,2024年数学建模比赛思路代码论文都会发布到专栏内,只需订阅一次! 完整论文+代码+数据结果链接在文末! 订阅后可查看参考论文文件 1 介绍 1.1 背景 乡村振兴是我国现代化建设的重要战略之一,而农业产业的可持续发展则是其中的核心内容。特别是在耕地资源有限的…

嵌入式软件--51单片机 DAY 4

一、蜂鸣器 当电流通过线圈时会产生电磁场&#xff0c;电磁场与永磁体相互作用&#xff0c;从而使金属膜产生震动而发声。为使金属膜持续震动&#xff0c;蜂鸣器需要使用震荡电路进行驱动。有些蜂鸣器元件内部自带震荡驱动电路&#xff0c;这种蜂鸣器叫做有源蜂鸣器&#xff0…

idea问题解决:java: -source 7 中不支持 方法引用 (请使用 -source 8 或更高版本以启用 方法引用)

以下是AI生成 &#xff1a;鱼聪明AI - 做您强大的AI助手 这个错误信息表明你尝试使用了Java 8中引入的方法引用特性&#xff0c;但是你的编译器设置使用的源代码版本是Java 7。方法引用是Java 8中引入的一个新特性&#xff0c;允许你以更简洁的方式调用方法。 要解决这个问题…

计算机网络 TCP/IP协议篇

今天学习了TCP/IP协议的相关知识&#xff0c;学习笔记如下&#xff1a; 在学习之前&#xff0c;我们先抛出几个问题&#xff0c;什么是TCP/IP协议簇&#xff1f;TCP/IP协议簇是怎么工作的&#xff1f; TCP/IP模型 协议分层 每层通过协议完成各自特定的功能上层依赖下层提供…

24/9/6算法笔记 kaggle 房屋价格

预测模型主要分为两大类&#xff1a; 回归模型&#xff1a;当你的目标变量是连续的数值时&#xff0c;你会使用回归模型进行预测。回归模型试图找到输入特征和连续输出之间的关联。一些常见的回归模型包括&#xff1a; 线性回归&#xff08;Linear Regression&#xff09;岭回归…

some electronic products

纽扣电池 button cell 运动手环 sports wristband 智能手环 smart bracelet 皮卡丘夜灯 pikachu night lamp 数字显示充电器 Charger with a digital display 磁吸无线充 magnetic wireless charger 直流电机调速器 DC motor speed controller 继电器模块 relay module 锂离子电…

学不会虚拟列表?10分钟带你实现高度固定的Vue虚拟列表方案及原理

前言 本文主要介绍长列表的一种优化方案&#xff1a;虚拟列表。本文主要是对传统的虚拟列表方案进行更加详尽的刨析&#xff0c;以便我们能够更加深入理解虚拟列表的原理。 虚拟列表目录 1、为什么需要使用虚拟列表2、什么是虚拟列表与懒加载的区别(重要) 3、实现思路4、通过节…

SAP PO附件上传报错 输入时错

SAP PO附件上传报错 场景&#xff1a; 在SAP采购订单上传附件时&#xff0c;出现了SO424报错 Error occurred during import(输入时错)&#xff0c;报错界面如下图所示&#xff1a; 分析&#xff1a; 输入事务代码SLG1&#xff0c;在User处输入自己的用户名并运行报表。本案例…

统计学习方法与实战——统计学习方法之感知机

感知机 感知机三要素分析模型策略损失函数选择 算法原始形式对偶形式 相关问题 例子iris数据集分类实战数据集查看 显示结果sklearn 实战感知机 习题解答习题2.1解题步骤反证法 习题2.2习题2.3凸壳线性可分线性可分证明凸壳不相交证明充分性&#xff1a;凸壳不相交\Rightarrow⇒…

Jenkins 通过 Version Number Plugin 自动生成和管理构建的版本号

步骤 1&#xff1a;安装 Version Number Plugin 登录 Jenkins 的管理界面。进入 “Manage Jenkins” -> “Manage Plugins”。在 “Available” 选项卡中搜索 “Version Number Plugin”。选中并安装插件&#xff0c;完成后可能需要重启 Jenkins。 步骤 2&#xff1a;配置…

c#如何实现触发另外一个文本框的回车事件

一.需求 我需要实现listview中的一行双击后&#xff0c;将其中的一个值传给一个文本框&#xff0c;传完后&#xff0c;给文本框一个回车指令。 我的方法&#xff1a;后面加上 \rthis.txt_ID.Text this.listView1.SelectedItems[0].Text"\r" 结果无效。 二.问通义…

【C#】DrawCurve的用法

DrawCurve 方法在 C# 中通常用于绘制一条平滑的曲线通过一系列给定的点。不过&#xff0c;需要注意的是 DrawCurve 并不是 C# 语言本身的一部分&#xff0c;而是在 .NET Framework 的 System.Drawing 命名空间中 Graphics 类的一个方法。 1. 如何使用 DrawCurve 方法&#xff…