华为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,一经查实,立即删除!

相关文章

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…

神经网络骨架nn.Module

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

如何在Word中插入复选框

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

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

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

计算机网络 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;岭回归…

学不会虚拟列表?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;配置…

ultralytics实现DeepSort目标追踪算法之特征提取网络

文章目录 DeepSort基本流程DeepSort特征提取网络Market-1501数据集目录结构命名规则 数据集划分 网络模型训练过程参数设置数据集加载特征提取网络定义预训练模型加载损失函数与优化器定义mian函数调用训练过程验证过程平均指标与结果 DeepSort基本流程 DeepSort&#xff08;D…

数据结构栈和队列

系统栈 程序运行中使用的栈&#xff0c;由操作系统维护 栈区&#xff1a;1&#xff0c;保存局部变量 2&#xff0c;函数的形参的返回值 3&#xff0c;函数的调用关系 函数中调用函数时会把调用函数的下一条指定的首地址保存在栈区。 &#xff08;保护现…

Steam游戏截图方法

Steam游戏截图方法 截图快捷键 Steam游戏自带截图功能&#xff0c;在游戏中无需复杂的快捷键&#xff0c;仅需按下F12快捷键便可立即截图&#xff0c;官方说明如下。下文介绍使用方法。 查看截图 退出游戏后&#xff0c;在Steam界面点击查看 - 截图&#xff0c;即可查看截…

JAVA—反射

学习Java中关于反射的知识&#xff0c;以理解框架 目录 1.认识反射 2.获取类 3.获取构造器 4.获取成员变量​编辑 5.获取成员方法 6.作用 应用场景 1.认识反射 反射 加载类 并允许以编程的方式解刨类中的各种成分&#xff08;成员变量 方法 构造器&#xff09; 学习反射…

【Hadoop|HDFS篇】HDFS的读写流程

1. HDFS的写流程 1.1 剖析文件的写入 副本存储节点的选择问题&#xff1a; 第一个副本在Client所在的节点上&#xff0c;如果客户端在集群外&#xff0c;随机选一个。第二个副本在另一个机架的随机一个节点上。第三个副本在第二个副本所在的机架的随机节点上。 2. HDFS的写流…

机器学习和物联网驱动技术在加工过程中监测工具磨损:一项全面的综述

这篇论文的标题是《Machine-Learning and Internet-of-Things-Driven Techniques for Monitoring Tool Wear in Machining Process: A Comprehensive Review》&#xff0c;由 Sudhan Kasiviswanathan、Sakthivel Gnanasekaran、Mohanraj Thangamuthu 和 Jegadeeshwaran Rakkiya…

超越传统:Reflection 70B如何革新AI语言处理

Reflection 70B&#xff1a;AI语言模型的新里程碑&#x1f680; AI领域迎来了革命性的变革&#xff0c;HyperWrite公司推出的开源AI大模型Reflection 70B&#xff0c;以其卓越的性能在多个基准测试中超越了GPT-4o和Llama 3.1。这款基于Meta的Llama 3.1 70B Instruct构建的模型…

为何iPhone 16系列的发布对苹果至关重要?

即将发布的iPhone 16系列对苹果来说将是至关重要的时刻&#xff0c;特别是在快速发展的AI智能手机市场背景下。随着Android制造商在集成先进AI功能方面领先一步&#xff0c;苹果正处于一个关键的转折点——赶上竞争对手不仅仅是选择&#xff0c;而是必须完成的任务。 AI竞赛&am…

上交2024最新-《动手学大模型》实战教程及ppt分享!

本课介绍 今天分享一个上海交大的免费的大模型课程&#xff0c;有相关教程文档和Slides&#xff0c;目前是2.2K星标&#xff0c;还是挺火的&#xff01; 《动手学大模型》系列编程实践教程&#xff0c;由上海交通大学2024年春季《人工智能安全技术》课程&#xff08;NIS3353&…