一、问题描述

给定一个二叉树,要求以非递归的方式进行中序遍历。

原题:二叉树的中序遍历 - leetcode

二、解题思路

首先需要知道一些前置知识:中序遍历是指按 左子树 -> 根节点 -> 右子树 的顺序遍历一棵树。因此递归方式实现中序遍历的方法很简单(中序遍历左子树 ->  遍历根 -> 中序遍历右子树)。题意要求非遍历,那我们可以用栈来模拟递归。(事实上,能用递归方式求解的问题都能用栈模拟。)

模拟遍历的过程,我们不难发现,中序遍历总是按照如下的流程进行:

<1>每当拿到一个新的根节点,我们总是尝试取他的左子树:

[1]若是取到了左子树,就会重复上述拿到新的根节点的过程即过程<1>;

[2]若是未取到左子树,回头遍历根节点,然后尝试遍历可能存在的右子树;

1>倘若取到了右子树,中序遍历右子树,即对右子树执行过程<1>;

2>倘若未取到右子树,返回,该层遍历完成,继续尝试取新节点;

我们可以用一个栈来模拟上述过程,栈中记录的是待遍历的节点,每当拿到一个新的节点,将他入栈,遍历完一个节点后则将他出栈,并紧接着将下一个能待处理的节点入栈,直到整个栈空,我们就认为遍历完成了。

三、C++代码

#include <iostream>
#include <vector>
#include <stack>using namespace std;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) {vector<int> result;stack<TreeNode *> tra_stack;TreeNode* tmp;if (root == nullptr)return result;bool doroot = false;tra_stack.push(root);while (tra_stack.size() != 0) {//Try leftif (!doroot && tra_stack.top()->left != nullptr) {tra_stack.push(tra_stack.top()->left);continue;}//Pop if no left.result.push_back(tra_stack.top()->val);tmp = tra_stack.top();tra_stack.pop();//Try right.if (tmp->right != nullptr) {tra_stack.push(tmp->right);doroot = false;}else {doroot = true;}}return result;}
};int main()
{TreeNode n2(2);TreeNode n4(4);TreeNode n5(5);TreeNode n3(3, &n4, &n5);TreeNode n1(1, &n2, &n3);Solution s;vector<int> res = s.inorderTraversal(&n1);for (auto re : res)cout << re << "  ";cout << endl;return 0;
}

四、复杂度分析

时间复杂度:O(n)。

空间复杂度:不超过 O(n)。

中序遍历二叉树-非递归方式实现-附C++代码相关推荐

  1. 中序遍历二叉树非递归

    用栈 void inOrder(Node *root){stack<Node*> st;Node *p = root;if(root == NULL)return ;else{st.pus ...

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

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

  3. C语言 中序遍历二叉树--非递归算法

    完整代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h>typedef struct B ...

  4. JAVA 中序遍历的非递归栈实现

    题目描述 请实现一个函数,检查一棵二叉树是否为二叉查找树. 给定树的根结点指针TreeNode* root,请返回一个bool,代表该树是否为二叉查找树. import java.util.*;/* ...

  5. 二叉树前中后序遍历的非递归实现以及层次遍历、zig-zag型遍历详解

    前言 二叉树的遍历是一个比较常见的问题,递归实现二叉树的前中后序遍历比较简单,但非递归实现二叉树的前中后序遍历相对有难度.这篇博客将详述如何使用非递归的方式实现二叉树的前中后序遍历,在进行理论描述的同 ...

  6. 二叉树前序、中序和后序遍历的非递归实现

    1 二叉树的遍历 1.1 前序遍历 对于每棵子树,先处理根,然后处理左子树,最后处理右子树.根最先访问,所以是前序遍历. 1.2 中序遍历 对于每棵子树,先处理左子树,然后处理根,最后处理右子树.根中 ...

  7. 非递归中序遍历二叉树

    中序遍历二叉树(递归) void inOrder(BT* root) {if (root == NULL)return;inOrder(root->lchild);cout << & ...

  8. 非递归中序遍历二叉树总结(2种方法)

    算法 非递归中序遍历二叉树总结(2种方法) @author:Jingdai @date:2020.12.03 传送门 非递归先序遍历二叉树 非递归后序遍历二叉树 方法1 先序遍历是第一次遇到该节点遍历 ...

  9. (※)中序遍历二叉树的非递归算法

    在此之前,我们已经学习了中序遍历二叉树的递归算法,相信大家已经将其牢牢掌握了. 除了使用递归思想作为求解问题的钥匙,还可以借助栈来以非递归方式实现该问题的求解. 首先,我们要讨论存储二叉树结点信息的栈 ...

最新文章

  1. mysql 5.7重新设置密码_mysql 5.7 安装及修改/重置密码
  2. AI安检:北航提出安检场景下的危险品检测基准和去遮挡注意力模块
  3. 开发教程(四) MIP组件平台使用说明
  4. Leet Code OJ 344. Reverse String [Difficulty: Easy]
  5. 斯坦福大学Andrew Ng - 机器学习笔记(8) -- 推荐系统 大规模机器学习 图片文字识别...
  6. Head First设计模式读书笔记八 第九章下 组合模式
  7. Spring : Spring @Transactional-嵌套事物回滚
  8. 【深度优先搜索】20行代码解决8皇后问题
  9. 删除数组中重复数字的算法
  10. python编写飞机大战小游戏+源码
  11. IT行业必须知道的基础知识
  12. cisp-pte渗透工程师考试总结
  13. debug-programe
  14. 浅谈互联网寒冬Android进阶之路
  15. 用python画蜡笔小新的步骤_蜡笔小新 - python代码库 - 云代码
  16. 微信小程序 + shiro 实现登录(安全管理) —— 保姆级教学
  17. IEEE检验格式出现字体嵌入问题
  18. 驭龙HIDS的简介,它开源了
  19. 从入门到入土:IP源地址欺骗dos攻击实验
  20. 电脑疑难杂症之Windows更新

热门文章

  1. 处理器后面的字母含义_科普向,笔记本cpu结尾字母的含义
  2. 从零开始学架构——异地多活架构
  3. 机器学习基础:最大似然(Maximum Likelihood) 和最大后验估计 (Maximum A Posteriori Estimation)的区别
  4. [译]Kotlin的独门秘籍Reified实化类型参数(上篇)
  5. ios8在通用设置中文键盘无效的解决方法(中文键盘设置)
  6. 修改MySQL密码策略
  7. 非接触式通信技术之RFID
  8. 卸载idea2020删除以前的配置_系统瘦身指南:卸载软件,看着简单,实际贼困难...
  9. 程序员应了解:知识技能金字塔
  10. 两款非常好的Redis 可视化管理工具:Another Redis Desktop Manager、QuickRedis