当前位置: 首页 > article >正文

C++ 实现二叉树的后序遍历与中序遍历构建及层次遍历输出

C++ 实现二叉树的后序遍历与中序遍历构建及层次遍历输出

目录

  • C++ 实现二叉树的后序遍历与中序遍历构建及层次遍历输出
    • 一、实验背景与目标
    • 二、实验环境
    • 三、实验内容
    • 四、数据结构与算法
      • 数据结构
      • 算法描述
        • 1. **构建二叉树函数 `buildTree`**
        • 2. **层次遍历函数 `LevelOrder`**
      • 关键代码与解释
      • 完整代码
    • 五、实验结果
    • 六、总结与思考

一、实验背景与目标

本实验旨在深入掌握二叉树的后序遍历和中序遍历构建二叉树的方法,并学习按层次遍历输出二叉树节点的算法。通过本实验,能够理解并实践如何通过后序和中序遍历信息来构建二叉树,并利用队列进行层次遍历输出。
在这里插入图片描述

二、实验环境

  • 开发环境:DevC++
  • 语言:C++

三、实验内容

  • 输入一个正整数 N ,表示二叉树中的节点数量。
  • 输入该二叉树的后序遍历和中序遍历序列,数字间以空格分隔。
  • 在一行中输出该树的层次遍历的序列,数字间以一个空格分隔,行首尾不得有多余空格。

四、数据结构与算法

数据结构

  1. 树节点结构体:我们使用结构体来表示树的每一个节点,其中包括节点值以及左右子树的指针。

    struct TreeNode {int val;TreeNode* left;TreeNode* right;
    };
    
  2. 队列:在层次遍历时,我们使用队列来保存当前需要处理的节点,队列的先进先出(FIFO)特性能够帮助我们按层次输出节点。

算法描述

1. 构建二叉树函数 buildTree

首先,根据给定的中序遍历数组 min[] 和后序遍历数组 post[],我们可以递归地构建二叉树。

  • 每次递归时,后序遍历的最后一个元素就是树的根节点。
  • 然后在中序遍历中找到根节点的位置,从而确定左子树和右子树的范围,再递归构建左右子树。
TreeNode* buildTree(int min[], int post[], int n) {if (!n)return NULL;TreeNode* T = (TreeNode*)malloc(sizeof(struct TreeNode));T->val = post[n - 1];  // 后序遍历的最后一个节点就是树的根节点T->left = T->right = NULL;// 从中序遍历中找到根节点的位置int index;for (index = 0; index < n; index++) {if (min[index] == post[n - 1]) break;}T->left = buildTree(min, post, index);T->right = buildTree(min + index + 1, post + index, n - index - 1);return T;
}
2. 层次遍历函数 LevelOrder

使用队列进行层次遍历,按顺序输出二叉树的节点。队列帮助我们按层次处理每一个节点。

void LevelOrder(TreeNode* root) {if (root == NULL) return;queue<TreeNode*> q;q.push(root);bool first = true;while (!q.empty()) {TreeNode* node = q.front();q.pop();if (first) {cout << node->val;first = false;} else {cout << " " << node->val;}if (node->left) q.push(node->left);if (node->right) q.push(node->right);}
}

关键代码与解释

  1. buildTree 函数:用于递归地构建二叉树。每次根据后序遍历的最后一个元素确定根节点,并在中序遍历中找到根节点的位置,从而递归构建左右子树。

  2. LevelOrder 函数:用于层次遍历输出二叉树的节点。利用队列进行层次遍历,逐个输出节点的值。

完整代码

#include <iostream>
#include <queue>
#include <cstring>
using namespace std;struct TreeNode {int val;TreeNode* left;TreeNode* right;
};TreeNode* buildTree(int min[], int post[], int n) {if (!n)return NULL;TreeNode* T = (TreeNode*)malloc(sizeof(struct TreeNode));T->val = post[n - 1];  // 后序遍历的最后一个节点就是树的根节点T->left = T->right = NULL;int index;for (index = 0; index < n; index++) {if (min[index] == post[n - 1]) break;}T->left = buildTree(min, post, index);T->right = buildTree(min + index + 1, post + index, n - index - 1);return T;
}void LevelOrder(TreeNode* root) {if (root == NULL) return;queue<TreeNode*> q;q.push(root);bool first = true;while (!q.empty()) {TreeNode* node = q.front();q.pop();if (first) {cout << node->val;first = false;} else {cout << " " << node->val;}if (node->left) q.push(node->left);if (node->right) q.push(node->right);}
}int main() {int N;cin >> N;int post[N], min[N];for (int i = 0; i < N; i++) cin >> post[i];for (int i = 0; i < N; i++) cin >> min[i];TreeNode* root = buildTree(min, post, N);LevelOrder(root);return 0;
}

五、实验结果

在这里插入图片描述

六、总结与思考

通过这次实验,我们掌握了二叉树的构建方法以及层次遍历算法。理解了如何根据后序遍历和中序遍历序列构建二叉树,并学习了如何使用队列进行层次遍历输出。此算法在实际应用中非常重要,特别是在树的遍历、图的搜索等领域。

希望通过这个实验,能够为大家深入理解二叉树的操作和算法提供帮助。

相关文章:

C++ 实现二叉树的后序遍历与中序遍历构建及层次遍历输出

C 实现二叉树的后序遍历与中序遍历构建及层次遍历输出 目录 C 实现二叉树的后序遍历与中序遍历构建及层次遍历输出一、实验背景与目标二、实验环境三、实验内容四、数据结构与算法数据结构算法描述1. **构建二叉树函数 buildTree**2. **层次遍历函数 LevelOrder** 关键代码与解…...

基于大模型的髋关节骨关节炎预测与治疗方案研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 研究方法与技术路线 二、髋关节骨关节炎概述 2.1 疾病定义与分类 2.2 发病机制与病理过程 2.3 流行病学特征 三、大模型技术原理与应用基础 3.1 大模型的基本概念与架构 3.2 大模型在医疗领域的应用进展…...

qiankun解决的问题

qiankun 中的沙箱机制是如何实现的&#xff1f;解决了什么问题&#xff1f; 一、实现方式 qiankun 的沙箱机制主要用于隔离微应用之间的运行环境&#xff0c;避免相互影响。其核心实现基于两种策略&#xff1a; 快照沙箱&#xff08;SnapshotSandbox&#xff09; 适用于不支…...

JavaScript从入门到精通(一)

引言 JavaScript 是一种跨平台、面向对象的脚本语言&#xff0c;最初是为了给网页添加交互性而创建的。如今&#xff0c;JavaScript 不仅是浏览器端开发的核心技术&#xff0c;也广泛应用于服务器端&#xff08;如 Node.js&#xff09;、移动应用开发等多个领域。本教程旨在提…...

快速失败(fail-fast)和安全失败(fail-safe)的区别

在 Java 中&#xff0c;‌快速失败&#xff08;Fail-Fast&#xff09;‌和‌安全失败&#xff08;Fail-Safe&#xff09;‌是集合类&#xff08;Collection&#xff09;在迭代过程中处理并发修改的两种不同策略&#xff0c;二者的核心区别在于 ‌对并发修改的感知机制与容错性‌…...

虚拟环境中的PyQt5 Pycharm设置参考

假如虚拟环境名是p3939 里面安装了pyqt5相关的库 1.QtDesigner Qt Designer 是通过拖拽的方式放置控件&#xff0c;并实时查看控件效果进行快速UI设计 位置 内容 name 可以随便命名&#xff0c;只要便于记忆就可以&#xff0c;本次采取通用…...

AI 笔记 - 模型优化 - 注意力机制在目标检测上的使用

人脸检测添加注意力机制 简介人脸检测的核心挑战与注意力机制的作用人脸检测中的注意力机制作用 选型参考基础选择&#xff08;空间注意力 vs 通道注意力&#xff09;空间注意力&#xff08;关注“哪里”重要&#xff09;通道注意力&#xff08;关注“什么特征”重要&#xff0…...

AUTOSAR图解==>AUTOSAR_SRS_LIN

AUTOSAR LIN模块分析 目录 LIN模块概述LIN模块架构LIN通信状态流程LIN通信序列LIN配置结构总结1. LIN模块概述 本文档基于AUTOSAR规范SRS_LIN文档,对LIN(Local Interconnect Network)相关模块进行详细分析。主要包括以下几个模块: LIN接口 (LinIf)LIN驱动 (Lin)LIN传输层…...

UML 时序图 使用案例

UML 时序图 UML 时序图 (Sequence Diagram)时序图的主要元素消息类型详解时序图示例时序图绘制步骤时序图的应用场景 UML 时序图 (Sequence Diagram) 时序图是UML(统一建模语言)中用于展示对象之间交互行为的动态视图&#xff0c;它特别强调消息的时间顺序。 时序图的主要元素…...

华为昇腾使用ollama本地部署DeepSeek大模型

文章目录 前言一、本次使用的硬件资源二、Ollama介绍三、Ollama在arm64位的芯片的安装及使用方法总结 前言 本次打算在华为昇腾上面使用ollama进行部署DeepSeek大模型。 一、本次使用的硬件资源 存储资源 内存资源 cpu资源 二、Ollama介绍 Ollama 是一个开源的大型语言…...

多态的总结

什么是多态&#xff1f; 答&#xff1a;多态是多种形态&#xff0c;是为了完成某种行为时&#xff0c;不同对象会产生不同的形态&#xff08;结合车票例子解释&#xff09; 2. 什么是重载、重写(覆盖)、重定义(隐藏)&#xff1f; 答&#xff1a;重载的条件是&#xff1a;在同一…...

Windows 高分辨率屏幕适配指南:解决界面过小、模糊错位问题

&#x1f5a5;️ Windows 高分辨率屏幕适配指南&#xff1a;解决界面过小、模糊错位问题 摘要&#xff1a; 在使用高分辨率屏幕时&#xff0c;许多老旧的桌面软件会出现界面显示异常的问题&#xff0c;例如窗口过小、控件错位、文字模糊等。本文提供一套通用解决方案&#xff0…...

tvalid寄存器的理解

if(!out_axis_tvalid_reg || m_axis_tready ) beginend m_axis_tready 是上拍下一级给的ready信号 out_axis_tvalid_reg是上一拍&#xff0c;本级给下级的valid信号 一共有四种组合&#xff0c;然后可以通过这个if语句&#xff0c;在接下来的begin ... end中&#xff0c;用来…...

C++八股 —— 手撕定时器

文章目录 1. 什么是定时器2. 需要考虑的问题吧3. 接口设计4. 完整代码5. 性能优化 来自&#xff1a;腾讯百度C二面&#xff1a;手撕定时器_哔哩哔哩_bilibili 腾讯、网易、百度C&#xff1a; 手撕定时器 相关概念参考&#xff1a; C八股——函数对象、Lambda、bind、functi…...

K8S-statefulset-mysql-ha

需求 实现一个HA mysql&#xff0c;包括1个master&#xff0c;2个slave。在K8S上已statefulset部署。 mysql HA原理 略 K8S环境需要解决的问题 1、由于使用同一个statefulset配置&#xff0c;因此需要考虑master和slave使用不同的cnf文件。 2、不同pod之间文件的传输 3、…...

【方案分享】展厅智能讲解:基于BLE蓝牙Beacon的自动讲解触发技术实现

【方案分享】展厅智能讲解&#xff1a;基于BLE蓝牙Beacon的自动讲解触发技术实现 让观众靠近展品即可自动弹出讲解页面&#xff0c;是智能展厅的核心功能之一。本文将从软硬件技术、BLE Beacon原理、微信小程序实现、优劣对比与拓展方案五个维度&#xff0c;系统讲解“靠近展台…...

web常见的攻击方式有哪些?如何防御?

Web常见攻击方式及防御策略 SQL注入 (SQL Injection) 详细解析: SQL 注入是一种利用应用程序未正确验证用户输入的漏洞&#xff0c;通过向应用传递恶意 SQL 查询来操纵数据库的行为。这种攻击可能导致敏感数据泄露、篡改或删除。 步骤: 攻击者找到可接受动态参数的应用程序…...

力扣:《螺旋矩阵》系列题目

今天做了一下螺旋矩阵主题的一系列题目 即力扣中的相似题目 还是有所感悟的 接下来一一回顾&#xff1a; 第一题&#xff1a; 59. 螺旋矩阵 II - 力扣&#xff08;LeetCode&#xff09; 这题让我们生成一个正方形的矩阵&#xff0c;注意是正方形&#xff0c;不是长方形&a…...

发电厂进阶,modbus TCP转ethernet ip网关如何赋能能源行业

案例分享&#xff1a;稳联技术modbus TCP转ethernet ip网关wl-abc004赋能&#xff0c;发电厂自动化改造&#xff0c;推动能源行业智能化升级 随着全球能源结构转型和“双碳”目标的推进&#xff0c;传统发电厂&#xff08;如火电、水电、生物质发电&#xff09;正面临严峻挑战&…...

深入了解linux系统—— 操作系统的路径缓冲与链接机制

前言 在之前学习当中&#xff0c;我们了解了被打开的文件是如何管理的&#xff1b;磁盘&#xff0c;以及ext2文件系统是如何存储文件的。 那我们要打开一个文件&#xff0c;首先要先找到这个文件&#xff0c;操作系统又是如何去查找的呢&#xff1f; 理解操作系统搜索文件 …...

Ansible快速入门指南

Ansible 是一款基于 Python 开发的开源自动化运维工具&#xff0c;主要用于实现服务器配置管理、应用部署、任务自动化执行等功能。它通过 简单的 YAML 脚本&#xff08;Playbook&#xff09; 定义任务&#xff0c;结合 SSH 协议 对远程主机进行管理&#xff0c;无需在被控节点…...

华为2025年校招笔试真题手撕教程(一)

一、题目 输入&#xff1a; 第一行为记录的版本迭代关系个数N&#xff0c;范围是[1&#xff0c;100000]; 第二行到第N1行&#xff1a;每行包含两个字符串&#xff0c;第一个字符串为当前版本&#xff0c;第二个字符串为前序版本&#xff0c;用空格隔开。字符串包含字符个数为…...

第9.2讲、Tiny Decoder(带 Mask)详解与实战

自己搭建一个 Tiny Decoder&#xff08;带 Mask&#xff09;&#xff0c;参考 Transformer Encoder 的结构&#xff0c;并添加 Masked Multi-Head Self-Attention&#xff0c;它是 Decoder 的核心特征之一。 1. 背景与动机 Transformer 架构已成为自然语言处理&#xff08;NLP…...

postgresql 常用参数配置

#01 - Connection-Authentication 优化点&#xff1a; listen_addresses 0.0.0.0 建议&#xff1a;生产环境应限制为具体IP&#xff08;如 192.168.1.0/24,127.0.0.1&#xff09;&#xff0c;避免暴露到公网。 ssl off 建议&#xff1a;启用SSL&#xff08;ssl on&#xf…...

Python模块中的私有命名与命名空间管理:深入解析与实践指南

文章大纲 引言 在Python开发中,模块是代码组织和复用的重要方式,而私有命名和命名空间管理则是确保代码清晰和避免冲突的关键机制。私有命名通过特定的命名约定限制了模块中某些内容的访问,有效保护了内部实现细节;命名空间管理则帮助开发者理解标识符的作用域和查找规则…...

基于PCRLB的CMIMO雷达网络多目标跟踪资源调度

针对分布式组网CMIMO雷达多目标跟踪(MTT)场景&#xff0c;博客分析了一种目标-雷达匹配方案与功率联合优化算法。在采用分布式组网融合架构的基础上&#xff0c;推导包含波束和功率分配的后验克拉美罗界(PCRLB)。随后&#xff0c;将该效用函数结合CMIMO雷达系统资源&#xff0c…...

AtCoder Beginner Contest 407(ABCDE)

A - Approximation 翻译&#xff1a; 给你一个正整数 A 和一个正奇数 B。 请输出与实数 的差最小的整数。 可以证明&#xff0c;在约束条件下&#xff0c;这样的整数是唯一的。 思路&#xff1a; 令。比较来判断答案。 实现&#xff1a; #include<bits/…...

VILT模型阅读笔记

代码地址&#xff1a;VILT Abstract Vision-and-Language Pre-training (VLP) has improved performance on various joint vision-andlanguage downstream tasks. Current approaches to VLP heavily rely on image feature extraction processes, most of which involve re…...

掌握 npm 核心操作:从安装到管理依赖的完整指南

图为开发者正在终端操作npm命令&#xff0c;图片来源&#xff1a;Unsplash 作为 Node.js 生态的基石&#xff0c;npm&#xff08;Node Package Manager&#xff09;是每位开发者必须精通的工具。每天有超过 1700 万个项目通过 npm 共享代码&#xff0c;其重要性不言而喻。本文…...

OpenCV CUDA模块特征检测与描述------一种基于快速特征点检测和旋转不变的二进制描述符类cv::cuda::ORB

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::ORB 是 OpenCV 库中 CUDA 模块的一部分&#xff0c;它提供了一种基于快速特征点检测和旋转不变的二进制描述符的方法&#xff0c;用于…...