LeetCode 算法:二叉树的中序遍历 c++

原题链接🔗:二叉树的中序遍历
难度:简单⭐️

题目

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

示例 1
在这里插入图片描述

输入:root = [1,null,2,3]
输出:[1,3,2]

示例 2

输入:root = []
输出:[]

示例 3

输入:root = [1]
输出:[1]

提示

树中节点数目在范围 [0, 100] 内
-100 <= Node.val <= 100

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

二叉树遍历

二叉树遍历是数据结构中的一个重要概念,它涉及到按照特定的顺序访问二叉树中的所有节点。二叉树的遍历主要有以下几种方式:

  1. 前序遍历(Pre-order Traversal)

    • 访问根节点。
    • 遍历左子树(前序)。
    • 遍历右子树(前序)。
  2. 中序遍历(In-order Traversal)

    • 遍历左子树(中序)。
    • 访问根节点。
    • 遍历右子树(中序)。
  3. 后序遍历(Post-order Traversal)

    • 遍历左子树(后序)。
    • 遍历右子树(后序)。
    • 访问根节点。
  4. 层序遍历(Level-order Traversal)

    • 使用队列实现,按照从上到下,从左到右的顺序访问每个节点。

每种遍历方式都有其特点和应用场景。下面是每种遍历方式的C++实现示例:

前序遍历

void preOrder(TreeNode* node) {if (node == nullptr) return;std::cout << node->val << " ";  // 访问根节点preOrder(node->left);            // 遍历左子树preOrder(node->right);           // 遍历右子树
}

中序遍历

void inOrder(TreeNode* node) {if (node == nullptr) return;inOrder(node->left);             // 遍历左子树std::cout << node->val << " ";  // 访问根节点inOrder(node->right);            // 遍历右子树
}

后序遍历

void postOrder(TreeNode* node) {if (node == nullptr) return;postOrder(node->left);           // 遍历左子树postOrder(node->right);          // 遍历右子树std::cout << node->val << " ";  // 访问根节点
}

层序遍历

void levelOrder(TreeNode* root) {if (root == nullptr) return;std::queue<TreeNode*> q;q.push(root);while (!q.empty()) {TreeNode* node = q.front();q.pop();std::cout << node->val << " ";if (node->left != nullptr) q.push(node->left);if (node->right != nullptr) q.push(node->right);}
}

在实际应用中,选择哪种遍历方式取决于你需要解决的问题。例如,如果你需要先访问根节点以决定后续操作,可能会选择前序遍历;如果你需要先访问所有子节点再访问根节点,可能会选择后序遍历;如果你需要按照树的层次顺序访问节点,可能会选择层序遍历。中序遍历通常用于二叉搜索树,因为它可以按照升序访问所有节点。

题解

递归法

  1. 解题思路

二叉树的中序遍历解题思路主要基于深度优先搜索(DFS)策略。以下是中序遍历的一般步骤和思路:

  1. 理解中序遍历的顺序:中序遍历的特点是先访问左子树,然后是根节点,最后是右子树。

  2. 递归方法

    • 从根节点开始,递归地执行中序遍历。
    • 对于每个节点,首先递归地遍历其左子节点。
    • 访问当前节点(根节点)。
    • 然后递归地遍历其右子节点。
  3. 使用栈实现非递归遍历

    • 使用一个栈来辅助实现非递归的中序遍历。
    • 从根节点开始,将其压入栈中。
    • 弹出栈顶元素,访问它的值,然后将其右子节点压入栈中。
    • 如果弹出的节点有左子节点,将其左子节点压入栈中,重复上述步骤。
    • 当栈为空时,遍历结束。
  4. 处理边界条件:确保在递归或非递归方法中处理空节点的情况。

  5. 代码实现

    • 定义一个二叉树节点结构,通常包含节点的值和指向左右子节点的指针。
    • 实现中序遍历函数,可以是递归形式或使用栈的非递归形式。
  6. 测试:使用不同的二叉树结构来测试你的中序遍历算法,确保它可以正确地按照中序遍历的顺序访问所有节点。

  7. 优化:考虑算法的时间复杂度和空间复杂度。对于递归方法,注意递归深度可能影响性能;对于非递归方法,注意栈的使用可能会增加空间开销。

  8. 考虑特殊情况:例如,二叉树只有一个节点或没有节点,或者二叉树是一条链(所有节点只有左或只有右子节点)。

  9. 使用辅助数据结构:如果需要存储遍历结果,可以使用数组、列表或其他数据结构来收集遍历过程中访问的节点值。

  1. 复杂度:空间复杂度O(n),时间复杂度O(n)。
  2. c++ demo
#include <iostream>
#include <vector>struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};void inorderTraversal(TreeNode* node) {if (node == nullptr) {return;}// 访问左子树inorderTraversal(node->left);// 访问根节点std::cout << node->val << " ";// 访问右子树inorderTraversal(node->right);
}int main() {// 构建一个示例二叉树//       1//      / \//     2   3//     \//      4TreeNode* root = new TreeNode(1);root->left = new TreeNode(2);root->right = new TreeNode(3);root->left->right = new TreeNode(4);// 执行中序遍历std::cout << "Inorder traversal of the binary tree is: ";inorderTraversal(root);// 清理内存delete root->left->right;delete root->left;delete root->right;delete root;return 0;
}
  • 输出结果:

Inorder traversal of the binary tree is: 2 4 1 3

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

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

相关文章

将Windows11右键菜单修改为Windows10风格

Windows11更新后&#xff0c;右键菜单很多功能隐藏起来了&#xff0c;使用时需要点击“显示更多选型”才能获取完整功能。为了能获得Windows10右键菜单丝滑的体验&#xff0c;我总结了以下方法。 方法一&#xff1a;控制台操作法 按住winR打开运行窗口 输入cmd&#xff0c;…

区间问题——905. 区间选点

目录 区间问题 定义 运用情况 注意事项 解题思路 AcWing 905. 区间选点 题目描述 运行代码 代码思路 改进思路 其它代码 代码思路 区间问题 定义 区间通常是指一个连续的范围&#xff0c;可以用数轴上的一段来表示。 运用情况 在数学中广泛用于表示变量的取值范…

未系安全带智能监测摄像机

未系安全带智能监测摄像机在现代安全管理中发挥着至关重要的作用。这些先进设备不仅仅是简单的监视工具&#xff0c;更是通过整合高级技术来提升工作效率和安全性&#xff0c;特别是在需要高度警惕的作业环境中尤为突出。 首先&#xff0c;这些智能监测摄像机配备了精准的视觉识…

SOLIDWORKS专业版2024价格

SOLIDWORKS Professional 专业版&#xff0c;带有 ECAD/MCAD 协作、自动成本估算、协作功能、设计和工程图检查、复杂的零部件库以及高级真实感渲染。 1. ECAD/MCAD协作&#xff1a;SOLIDWORKS专业版提供了强大的ECAD/MCAD协作功能&#xff0c;使得设计团队可以更高效地进行跨…

HTML(23)——垂直对齐方式

垂直对齐方式 属性名&#xff1a;vertical-align 属性值效果baseline基线对齐(默认)top顶部对齐middle居中对齐bottom底部对齐 默认情况下浏览器对行内块&#xff0c;行内标签都按文字处理&#xff0c;默认基线对齐 导致图片看起来会偏上&#xff0c;文字偏下。 示例&#…

谷歌浏览器截图

一 右击&#xff0c;然后点击检查&#xff1b; 二 然后ctrlshiftp,运行命令&#xff1b; 三 3.1搜索截图&#xff1a; 如果你设置为中文&#xff0c;搜索截图&#xff0c;选择你想要的截图类型&#xff1b; 如果你是在英文情况下&#xff1a; 输入capture full size 来过滤…

【Redis】如何保证缓存和数据库的一致性

目录 背景问题思路 三个经典的缓存模式Cache-Aside读缓存写缓存为什么是删除旧缓存而不是更新旧缓存&#xff1f;为什么不先删除旧的缓存&#xff0c;然后再更新数据库&#xff1f; 延迟双删如何确保原子性 Read-Through/Write-ThroughRead-ThroughWrite-Through Write Behind …

【九】【QT开发应用】WebRTC的sigslot源码和使用WebRTC的sigslot使用编写信号槽

WebRTC&#xff08;Web Real-Time Communication&#xff09; 是一个开源项目&#xff0c;提供实时通信能力&#xff0c;广泛应用于视频、音频和数据传输。在WebRTC的实现中&#xff0c;sigslot库用于信号和槽机制&#xff0c;以实现事件驱动的编程模型。 WebRTC的sigslot部分…

泰迪智能科技大数据人工智能实训室优势特色介绍

泰迪智能科技大数据人工智能实训室是面向人工智能技术应用、大数据技术、软件技术专业&#xff0c;是一个教、学、培训认证统一的实训平台&#xff0c;集教学、实训、培训认证功能于一体&#xff0c;围绕人工智能主题&#xff0c;同时兼顾当前IT流行技术的发展趋势&#xff0c;…

Linux tcpdump抓包必备知识

author: 放牛娃学编程 moto: 分享与热爱&#xff0c;不是大爱我不说 放牛娃每日一语: 除了你自己&#xff0c;没有人可以说你不行 别急着划开&#xff0c;这篇笔记一定能够给你带来收获 因为这里你能学到AI永远也给不了你的知识 Linux tcpdump抓包必备知识 文章目录 Linux tcp…

Softing “Ethernet-APL现场交换机”亮相ACHEMA 2024

Softing工业在ACHEMA 2024上展示了新的“aplSwitch Field”。作为一个先进的16端口以太网高级物理层&#xff08;Ethernet-APL&#xff09;现场交换机&#xff0c;它配有可选的PROFIBUS Process Automation&#xff08;PA&#xff09;代理&#xff0c;适用于Zone 2环境&#xf…

JavaWeb系列二十: jQuery的DOM操作 下

jQuery的DOM操作 CSS-DOM操作多选框案例页面加载完毕触发方法作业布置jQuery获取选中复选框的值jQuery控制checkbox被选中jQuery控制(全选/全不选/反选)jQuery动态添加删除用户 CSS-DOM操作 获取和设置元素的样式属性: css()获取和设置元素透明度: opacity属性获取和设置元素高…

数字化营销与传统营销的完美协奏曲!

在这个数字化的时代&#xff0c;营销的世界正在发生着巨大的变革&#xff01;数字化营销如火箭般崛起&#xff0c;但传统营销也并未过时。那么&#xff0c;如何让它们携手共进&#xff0c;创造出无与伦比的营销效果呢&#xff1f;今天&#xff0c;就让我们讲述一下蚓链数字化营…

拼多多面试总结

文章目录 一面自我介绍提问算法反问结果 二面提问算法反问结果 主管面主管面试准备算法题其他个人提问准备 提问数据库普通索引和覆盖索引的区别索引是什么&#xff1f;索引怎么加快数据库查询的&#xff1f;索引具体怎么实现的&#xff1f;以B树为例&#xff0c;节点放了什么&…

自动预约申购 i茅台工具完善

自动预约申购茅台工具 概述新的改变界面预览 概述 今天刷到一个windows自动刷茅台的工具&#xff0c;是用wpf实现的&#xff0c;看到作者最后是2023年更新的&#xff0c;评论中有好多人提出一些需求&#xff0c;刚才在学习wpf&#xff0c;就试着完善了一下。 工具下载&#x…

【C++】文件处理(IO流)

文章目录 C IO流1. C语言IO2. CIO2.1 C标准IO流2.2 C文件IO流2.3 C IO 文件常用函数总结表2.4 C stringstream C IO流 回顾一下&#xff0c;C语言中IO输入输出的 1. C语言IO C语言中常用的输入输出函数有如下几种&#xff1a;前者是格式化标准输入输出&#xff0c;后者是格式化…

windows和linux下清空Redis

前言 在本文中&#xff0c;我们将详尽阐述在Windows与Linux操作系统中有效清除Redis缓存的实践方法&#xff0c;旨在为您提供清晰、高效的指导流程&#xff0c;确保数据管理的灵活性与效率。 windows下推荐两款可视化工具 Another Redis Desktop Manager 这是我用的最多也是最…

数据库原理与安全复习笔记(未完待续)

1 概念 产生与发展&#xff1a;人工管理阶段 → \to → 文件系统阶段 → \to → 数据库系统阶段。 数据库系统特点&#xff1a;数据的管理者&#xff08;DBMS&#xff09;&#xff1b;数据结构化&#xff1b;数据共享性高&#xff0c;冗余度低&#xff0c;易于扩充&#xff…

ROS话题通信流程自定义数据格式

ROS话题通信流程自定义数据格式 需求流程实现步骤定义msg文件编辑配置文件编译 在 ROS 通信协议中&#xff0c;数据载体是一个较为重要组成部分&#xff0c;ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty… 但是&#xff0c;这些…

从移动切换到电信IP:详细介绍两种方法

在当前的互联网环境中&#xff0c;用户可能会因为各种原因需要切换网络服务提供商&#xff0c;比如从移动切换到电信。这种切换不仅涉及到网络服务的变更&#xff0c;还可能意味着IP地址的改变。那么&#xff0c;移动的怎么切换成电信的IP&#xff1f;下面一起来了解一下吧。 方…