C++遍历树,前中后序,递归非递归实现

文章目录

      • 前序遍历
      • 中序遍历
      • 后序遍历
      • 代码解释

在这里插入图片描述

前序遍历

  • 递归思路:先访问根节点,然后递归遍历左子树,最后递归遍历右子树。
  • 非递归思路:使用栈来模拟递归过程。先将根节点入栈,之后循环执行以下操作:弹出栈顶元素并访问,若其右子节点存在则将右子节点入栈,若其左子节点存在则将左子节点入栈。

中序遍历

  • 递归思路:先递归遍历左子树,接着访问根节点,最后递归遍历右子树。
  • 非递归思路:利用栈。从根节点开始,持续将左子节点入栈,直至左子节点为空;接着弹出栈顶元素并访问,再将当前节点设为其右子节点,重复上述操作。

后序遍历

  • 递归思路:先递归遍历左子树,再递归遍历右子树,最后访问根节点。
  • 非递归思路:借助两个栈。第一个栈用于模拟递归调用,第二个栈用于存储最终的遍历结果。先将根节点压入第一个栈,之后循环:从第一个栈弹出节点并压入第二个栈,若该节点有左子节点则将左子节点压入第一个栈,若有右子节点则将右子节点压入第一个栈。最后从第二个栈依次弹出元素。

以下是完整的 C++ 代码实现:

#include <iostream>
#include <stack>
#include <vector>// 定义二叉树节点结构
struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};// 前序遍历 - 递归
void preorderTraversalRecursive(TreeNode* root, std::vector<int>& result) {if (root == nullptr) return;result.push_back(root->val);preorderTraversalRecursive(root->left, result);preorderTraversalRecursive(root->right, result);
}// 前序遍历 - 非递归
std::vector<int> preorderTraversalIterative(TreeNode* root) {std::vector<int> result;if (root == nullptr) return result;std::stack<TreeNode*> stack;stack.push(root);while (!stack.empty()) {TreeNode* node = stack.top();stack.pop();result.push_back(node->val);if (node->right) stack.push(node->right);if (node->left) stack.push(node->left);}return result;
}// 中序遍历 - 递归
void inorderTraversalRecursive(TreeNode* root, std::vector<int>& result) {if (root == nullptr) return;inorderTraversalRecursive(root->left, result);result.push_back(root->val);inorderTraversalRecursive(root->right, result);
}// 中序遍历 - 非递归
std::vector<int> inorderTraversalIterative(TreeNode* root) {std::vector<int> result;std::stack<TreeNode*> stack;TreeNode* current = root;while (current != nullptr || !stack.empty()) {while (current != nullptr) {stack.push(current);current = current->left;}current = stack.top();stack.pop();result.push_back(current->val);current = current->right;}return result;
}// 后序遍历 - 递归
void postorderTraversalRecursive(TreeNode* root, std::vector<int>& result) {if (root == nullptr) return;postorderTraversalRecursive(root->left, result);postorderTraversalRecursive(root->right, result);result.push_back(root->val);
}// 后序遍历 - 非递归
std::vector<int> postorderTraversalIterative(TreeNode* root) {std::vector<int> result;if (root == nullptr) return result;std::stack<TreeNode*> stack1, stack2;stack1.push(root);while (!stack1.empty()) {TreeNode* node = stack1.top();stack1.pop();stack2.push(node);if (node->left) stack1.push(node->left);if (node->right) stack1.push(node->right);}while (!stack2.empty()) {result.push_back(stack2.top()->val);stack2.pop();}return result;
}// 辅助函数:打印结果
void printResult(const std::vector<int>& result) {for (int val : result) {std::cout << val << " ";}std::cout << std::endl;
}int main() {// 构建一个简单的二叉树TreeNode* root = new TreeNode(1);root->left = new TreeNode(2);root->right = new TreeNode(3);root->left->left = new TreeNode(4);root->left->right = new TreeNode(5);std::vector<int> result;// 前序遍历std::cout << "Preorder Traversal (Recursive): ";preorderTraversalRecursive(root, result);printResult(result);result.clear();std::cout << "Preorder Traversal (Iterative): ";result = preorderTraversalIterative(root);printResult(result);result.clear();// 中序遍历std::cout << "Inorder Traversal (Recursive): ";inorderTraversalRecursive(root, result);printResult(result);result.clear();std::cout << "Inorder Traversal (Iterative): ";result = inorderTraversalIterative(root);printResult(result);result.clear();// 后序遍历std::cout << "Postorder Traversal (Recursive): ";postorderTraversalRecursive(root, result);printResult(result);result.clear();std::cout << "Postorder Traversal (Iterative): ";result = postorderTraversalIterative(root);printResult(result);// 释放内存delete root->left->left;delete root->left->right;delete root->left;delete root->right;delete root;return 0;
}    

代码解释

  1. TreeNode 结构体:用于定义二叉树的节点,包含节点的值、左子节点指针和右子节点指针。
  2. 递归遍历函数preorderTraversalRecursiveinorderTraversalRecursivepostorderTraversalRecursive 分别实现了前序、中序和后序遍历的递归版本。
  3. 非递归遍历函数preorderTraversalIterativeinorderTraversalIterativepostorderTraversalIterative 分别实现了前序、中序和后序遍历的非递归版本。
  4. printResult 函数:用于打印遍历结果。
  5. main 函数:构建一个简单的二叉树,调用各个遍历函数并打印结果,最后释放二叉树占用的内存。

通过运行上述代码,你可以看到不同遍历方式的结果。

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

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

相关文章

Spring 声明式事务应该怎么学?

1、引言 Spring 的声明式事务极大地方便了日常的事务相关代码编写&#xff0c;它的设计如此巧妙&#xff0c;以至于在使用中几乎感觉不到它的存在&#xff0c;只需要优雅地加一个 Transactional 注解&#xff0c;一切就都顺理成章地完成了&#xff01; 毫不夸张地讲&#xff…

面试复习-基础网络+运维知识

一、TCP/IP模型及每层对应通信协议 1.1第一层-应用层 作用&#xff1a;服务及应用程序 HTTP --- 超文本传输协议--- 获取网页信息---80&#xff08;TCP 80&#xff09; HTTPS --- HTTP SSL&#xff08;安全传输协议&#xff09;/TLS ---443&#xff08;TCP 443&#xff09; …

HeyGem.ai 全离线数字人生成引擎加入 GitCode:开启本地化 AIGC 创作新时代

在人工智能技术飞速演进的时代&#xff0c;数据隐私与创作自由正成为全球开发者关注的焦点。硅基智能旗下开源项目 HeyGem.ai 近日正式加入 GitCode&#xff0c;以全球首个全离线数字人生成引擎的颠覆性技术&#xff0c;重新定义人工智能生成内容&#xff08;AIGC&#xff09;的…

【C语言】递归:原理、技巧与陷阱

在C语言编程中&#xff0c;递归是一种非常强大且常用的技术。它允许函数自我调用&#xff0c;从而简化代码并解决复杂问题。然而&#xff0c;递归也可能导致性能问题&#xff0c;如栈溢出。本文将深入探讨递归的原理、应用、优化方法&#xff0c;并提供实际代码示例&#xff0c…

【C#语言】C#同步与异步编程深度解析:让程序学会“一心多用“

文章目录 ⭐前言⭐一、同步编程&#xff1a;单线程的线性世界&#x1f31f;1、寻找合适的对象✨1) &#x1f31f;7、设计应支持变化 ⭐二、异步编程&#xff1a;多任务的协奏曲⭐三、async/await工作原理揭秘⭐四、最佳实践与性能陷阱⭐五、异步编程适用场景⭐六、性能对比实测…

[OpenCV】相机标定之棋盘格角点检测与绘制

在OpenCV中&#xff0c;棋盘格角点检测与绘制是一个常见的任务&#xff0c;通常用于相机标定。 棋盘格自定义可参考: OpenCV: Create calibration pattern 目录 1. 棋盘格角点检测 findChessboardCorners()2. 棋盘格角点绘制 drawChessboardCorners()3. 代码示例C版本python版本…

AI-Talk开发板之更换串口引脚

一、默认引脚 CSK6011A使用UART0作为Debug uart&#xff0c;AI-Talk开发板默认使用的GPIOA2和GPIOA3作为Debug uart的RX和TX&#xff0c;通过连接器CN6引出。 二 、更换到其它引脚 查看60xx_iomux_v1.0可以&#xff0c;UART0的tx和rx可以映射到很多管脚上。 结合AI-Talk开发板…

QT Quick(C++)跨平台应用程序项目实战教程 3 — 项目基本设置(窗体尺寸、中文标题、窗体图标、可执行程序图标)

目录 1. 修改程序界面尺寸和标题 2. 窗体图标 3. 修改可执行程序图标 上一章创建好了一个初始Qt Quick项目。本章介绍基本的项目修改方法。 1. 修改程序界面尺寸和标题 修改Main.qml文件&#xff0c;将程序宽度设置为1200&#xff0c;程序高度设置为800。同时修改程序标题…

【STM32实物】基于STM32的太阳能充电宝设计

基于STM32的太阳能充电宝设计 演示视频: 基于STM32的太阳能充电宝设计 硬件组成: 系统硬件包括主控 STM32F103C8T6、0.96 OLED 显示屏、蜂鸣器、电源自锁开关、温度传感器 DS18B20、继电器、5 V DC 升压模块 、TB4056、18650锂电池、9 V太阳能板、稳压降压 5 V三极管。 功能…

003-掌控命令行-CLI11-C++开源库108杰

首选的现代C风格命令行参数解析器! &#xff08;本课程包含两段教学视频。&#xff09; 以文件对象监控程序为实例&#xff0c;五分钟实现从命令行读入多个监控目标路径&#xff1b;区分两大时机&#xff0c;学习 CLI11 构建与解析参数两大场景下的异常处理&#xff1b;区分三…

OpenCV图像拼接(2)基于羽化(feathering)技术的图像融合算法拼接类cv::detail::FeatherBlender

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::detail::FeatherBlender 是 OpenCV 中用于图像拼接的一个类&#xff0c;它属于 stitching 模块的一部分。这个类实现了基于羽化&#xff08;…

如何用Function Calling解锁OpenAI的「真实世界」交互能力?(附Node.js 实战)

一、Function Calling&#xff1a;大模型的「手脚延伸器」 1.1 核心定义 Function Calling是OpenAI在2023年6月13日推出的革命性功能&#xff08;对应模型版本gpt-3.5-turbo-0613和gpt-4-0613&#xff09;&#xff0c;允许开发者通过自然语言指令触发预定义函数&#xff0c;实…

鸿蒙ArkTS+ArkUI实现五子棋游戏

鸿蒙ArkTSArkUI实现五子棋游戏 前言 近期&#xff0c;鸿蒙系统热度飙升&#xff0c;引发了周围众多朋友的热烈探讨。出于这份浓厚的好奇心&#xff0c;我初步浏览了其官方文档&#xff0c;发现信息量庞大&#xff0c;全面消化需耗时良久并考验人的毅力。自踏入编程领域以来&am…

单元测试mock

一、背景 现在有A类,B类,C类&#xff0c;A类依赖B类,依赖C类&#xff0c;如果想要测试A类中的某个方法的业务逻辑。A类依赖其他类&#xff0c;则把其他类给mock&#xff0c;然后A类需要真实对象。这样就可以测试A类中的方法。 举例&#xff1a;Ticket类需要调用Flight类和Pas…

深度学习篇---深度学习中的范数

文章目录 前言一、向量范数1.L0范数1.1定义1.2计算式1.3特点1.4应用场景1.4.1特征选择1.4.2压缩感知 2.L1范数&#xff08;曼哈顿范数&#xff09;2.1定义2.2计算式2.3特点2.4应用场景2.4.1L1正则化2.4.2鲁棒回归 3.L2范数&#xff08;欧几里得范数&#xff09;3.1定义3.2特点3…

JVM常见概念之条件移动

问题 当我们有分支频率数据时&#xff0c;有什么有趣的技巧可以做吗&#xff1f;什么是条件移动&#xff1f; 基础知识 如果您需要在来自一个分支的两个结果之间进行选择&#xff0c;那么您可以在 ISA 级别做两件不同的事情。 首先&#xff0c;你可以创建一个分支&#xff…

Debug-037-table列表勾选回显方案

效果展示&#xff1a; 图1 图2 最近实现一个支持勾选的el-table可以回显之前勾选项的功能。实现了一个“编辑”的功能&#xff1a; 在图1中的列表中有三行数据&#xff0c;当点击“更换设备”按钮时&#xff0c;打开抽屉显示el-table组件如图2所示&#xff0c;可以直接回显勾选…

Python散点图(Scatter Plot):数据探索的“第一张图表”

在数据可视化领域,散点图是一种强大而灵活的工具,它能够帮助我们直观地理解和探索数据集中变量之间的关系。本文将深入探讨散点图的核心原理、应用场景以及如何使用Python进行高效绘制。 后续几篇将介绍高级技巧、复杂应用场景。 Python散点图(Scatter Plot):高阶分析、散点…

docker利用ollama +Open WebGUI在本地搭建部署一套Deepseek-r1模型

系统&#xff1a;没有限制&#xff0c;可以运行docker就行 磁盘空间&#xff1a;至少预留50GB; 内存&#xff1a;8GB docker版本&#xff1a;4.38.0 桌面版 下载ollama镜像 由于docker镜像地址&#xff0c;网络不太稳定&#xff0c;建议科学上网的一台服务器拉取ollama镜像&am…

JavaScript |(六)DOM事件 | 尚硅谷JavaScript基础实战

学习来源&#xff1a;尚硅谷JavaScript基础&实战丨JS入门到精通全套完整版 笔记来源&#xff1a;在这位大佬的基础上添加了一些东西&#xff0c;欢迎大家支持原创&#xff0c;大佬太棒了&#xff1a;JavaScript |&#xff08;六&#xff09;DOM事件 | 尚硅谷JavaScript基础…