声明:本文原题主要来自力扣,记录此博客主要是为自己学习总结,不做任何商业等活动!

二叉树的遍历有前序遍历、中序遍历、后序遍历和层次遍历,其中二叉树基本知识点可以参考博主上篇博客(二叉树基本知识点图文介绍(全网最简洁)_净无邪博客-CSDN博客),二叉树的前序遍历可以参考博主这篇博客(二叉树前序遍历(递归法和迭代法(即非递归法))——C++_净无邪博客-CSDN博客),后序遍历可以参考博主这篇博客(二叉树后序遍历(递归法和迭代法(非递归法))——C++),本文主要总结二叉树的中序遍历。

一、二叉树中序遍历

中序遍历是先遍历左子节点left,在遍历父节点parent,最后遍历右子节点right,即遍历顺序:

left ——> parent ——> right

下面是力扣原题,写一个中序遍历程序。

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

示例 1:

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

1.1递归法

递归法主要用编译器栈自动压入递归的函数参数和局部变量,依次按照中序遍历顺序有且仅有一次访问二叉树。下面是具体示例代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {if(root == nullptr)return datas;if(root->left != nullptr)inorderTraversal(root->left);datas.push_back(root->val);if(root->right != nullptr)inorderTraversal(root->right);return datas;}private:vector<int> datas;
};

结果:

1.2迭代法

迭代法是采用非递归方法实现二叉树的中序遍历,主要利用数据结构std::stack来实现,利用栈std::stack的先进后出特性依次压入待访问的节点,然后依次按照中序遍历顺序弹出和访问节点,确保每个节点有且仅有一次访问。

具体步骤如下:

a1 先将所有父节点和左子节点依次压入栈;

这样做的目的是为了先弹出左子节点,再弹出父节点,可以在弹出左子节点的时候进行遍历,同时处理右节点,比如将右节点压入栈,这样就实现了先访问左节点,然后父节点,最后右子节点。

while (cur != nullptr)
{nodeStack.push(cur);cur = cur->left;
}

a2 然后弹出一个节点,进行遍历;

此时弹出的节点前提是左子节点为空,则该节点是父节点,故需要在后面遍历右子节点

cur = nodeStack.top();
nodeStack.pop();
datas.push_back(cur->val);

a3 遍历右子节点,将其作为一棵右子节点树的父节点,继续循环第a1步骤,直到整个栈为空即可

while (cur != nullptr || !nodeStack.empty())
{while (cur != nullptr) // 控制父节点和左子树非空,则先压入父节点,然后压入左节点{// 循环将做父节点和左子树压入栈 ......}// 弹出栈和遍历节点 ......cur = cur->right; // 将弹出栈的右子节点当作右子树的父节点进行循环遍历
}

下面是完整代码实现:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {TreeNode* cur = root;std::stack<TreeNode *> nodeStack;while(cur != nullptr || !nodeStack.empty()) // 循环截止条件是父节点为空或栈为空{while(cur != nullptr) // 控制父节点和左子树非空,则先压入父节点,然后压入左节点{nodeStack.push(cur);cur = cur->left;}cur = nodeStack.top();nodeStack.pop();datas.push_back(cur->val);cur = cur->right; // 将弹出栈的右子节点当作父节点进行循环遍历}return datas;}
private:vector<int> datas;
};

结果:

1.3总结

二叉树的中序遍历递归法跟前序遍历差不多,但是迭代法在代码结构上却有较大差别,前序遍历主要通过一个栈先访问当前节点也就是父节点,然后再遍历左节点,接着遍历右节点,代码结构清晰易于理解;但是中序遍历的迭代法代码实现结构却不同,主要还是数据结构栈的性质,决定了中序遍历需要先将父节点压入栈,然后压入左节点,这是一个循环的步骤,直到左子树为空才停止压栈,此时需要弹出栈进行遍历该节点(可以看成父节点,左节点为空),遍历完后再将该节点的右节点作为右子树的父节点,重复前面步骤,直到整个栈为空即可完成每个节点中序遍历。

二叉树中序遍历(递归法和迭代法(非递归法))——C++相关推荐

  1. 面试题 7 :二叉树遍历-前序遍历(DLR),中序遍历(LDR),后序遍历(LRD)-Android端非递归实现

    二叉树实体定义: /*** Author: Heynchy* Date: 2019/6/24* <p>* Introduce: 二叉树的定义*/ public class TreeNode ...

  2. 数据结构二叉树中序遍历递归和非递归算法

    2022.11.19 二叉树中序遍历递归和非递归算法 任务描述 相关知识 编程要求 测试说明 C/C++代码 任务描述 本关任务:给定一棵二叉树,使用递归和非递归的方法实现二叉树的中序遍历结果. 相关 ...

  3. 详细图解二叉树中序遍历(非递归C++)LeetCode94

    详细图解二叉树中序遍历(非递归) 二叉树中序递归含义 LeetCode题目94 详细图解 源代码 运行结果 二叉树中序递归含义 中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树.若二叉树为空则结 ...

  4. 【C语言】二叉树中序遍历(递归和非递归)算法

    二叉树中序遍历的实现思想是: 访问当前节点的左子树: 访问根节点: 访问当前节点的右子树: 图 1 二叉树 以图  1 为例,采用中序遍历的思想遍历该二叉树的过程为: 访问该二叉树的根节点,找到 1: ...

  5. Java 二叉树中序遍历(递归/非递归)

    Java 二叉树中序遍历(递归/非递归) 中序遍历 代码实现 递归方式 非递归方式 简介: 遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访 ...

  6. leetcode算法题--二叉树中序遍历迭代法

    原题链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal/ 二叉树中序遍历迭代法,栈实现 vector<int> ...

  7. 二叉树中序遍历线索化 C++ 递归实现

    二叉树中序遍历线索化 中序遍历有一个特点,只要不是叶子节点,遍历的时候左孩子一定是当前节点的上一个访问节点:右孩子一定是当前节点的下一个访问节点. 如果把叶子节点的左右孩子都利用起来,把空的左孩子做成 ...

  8. 二叉树中序遍历的三种方法

    题目描述: 给定一个二叉树的根节点root,返回它的中序遍历. 方法一:递归 思路与算法: 二叉树的中序遍历:按照访问左子树-根节点-右子树的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样 ...

  9. 基本题型记录-二叉树中序遍历

    由于本人基础较差,所以针对部分题型做一个记录,以免自己忘记 1.二叉树中序遍历 这个遍历方法可以搜一下博客上很多讲解,这里主要是记录一下代码实现,以下面的二叉树为例子 结果应该是 2.迭代法 2.1 ...

最新文章

  1. TP-link 设置MAC地址过滤
  2. Linux13-bash脚本编程基础及配置文件
  3. 什么是错误的幻数错误?
  4. ROS学习之URDF
  5. 015_html注释
  6. 细数那些能让人惊喜的windows技巧
  7. Angular 下的 function
  8. 为什么要设置Java环境变量(详解)
  9. HDU 2612 (两边一起)
  10. 可视化 nltk_词嵌入:具有Genism,NLTK和t-SNE可视化的Word2Vec
  11. webbrowser 模块的 open()方法
  12. matlab模拟砂轮形貌,基于多颗磨粒随机分布的虚拟砂轮建模及磨削力预测
  13. 360服务器linux版,360浏览器Linux版
  14. 网络安全攻防实验室通关教程-脚本关
  15. 安徽师大附中%你赛day7 T2 乘积 解题报告
  16. 论文精读(1)-- Lipschitz constrained parameter initialization for deep transformers
  17. PostgreSQL 14 pageinspect新增gist索引支持
  18. MSGraphMailbag - 复制/移动 SharePoint Online 中的文件和文件夹
  19. STM32单片机基于HAL库开发HC-SR04 超声波测距模块(终极版)
  20. 清华大学计算机系董教授,董占民-清华大学物理系

热门文章

  1. OpenWRT好用的插件
  2. 交叉编译mysql5.7.16_交叉编译Qt5.7
  3. 金蝶KS客户端无法连接服务端
  4. android 点9图制作方法
  5. 删除苹果自带软件后果_苹果录音机在哪?这个自带软件太厉害了,还不会用不如换手机...
  6. 知识图谱 数据模型和查询语言
  7. 打印5列五颗星_王者荣耀段位排列每个段位多少星?段位排列标志多久刷新一次?[多图]...
  8. js怎么向上取整,js 如何向上取整得到距离最近的整十,整百,整千,整万的值?...
  9. mac qq电话时其他媒体声音变小
  10. OSChina 周一乱弹 —— 有妹子愿意帮助一位爱情残疾人么?