94. 二叉树的中序遍历

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

示例 1

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

输出:[1,3,2]

示例 2

输入:root = []

输出:[]

示例 3

输入:root = [1]

输出:[1]

示例 4

输入:root = [1,2]

输出:[2,1]

示例 5

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

输出:[1,2]

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

思路:

二叉树的前中后序遍历是算法与数据结构的必备基础了。

因为在学习算法和数据结构早期,我们就是通过这几种不同的遍历顺序来学习递归的。首先讲一下递归的实现:①定义base case ②根据那种遍历,写顺序(中序遍历就是“左右中”的顺序即可。)

代码(递归):

class Solution(object):def inorderTraversal(self, root):res=[]def zhong(root):if not root:return#base casezhong(root.left)#左res.append(root.val)#中zhong(root.right)#右zhong(root)return res

注意到有个进阶要求: 递归算法很简单,你可以通过迭代算法完成吗?

其实用非递归的方式实现二叉树的遍历并不算是偏难要求,在面试过程中,用非递归实现二叉树的前中后序遍历是很高频的问题。

我们可以通过来辅助实现非递归形式下的二叉树遍历。虽然前中后序遍历的递归方法并不是非常相似(如果要去理解如何迭代的思路迭代话),但经过特定的总结和整合,我们现在可以只用一个模板,只改一个地方来实现非递归下三种不同的遍历方式。

接下来这个模板是我在众多模板中分析得到的最简单明了的一种,我不打算从逻辑上去解释这个过程了,只需要记下这个模板,后续不管是那种顺序的遍历,都可以直接用这么一段代码非递归地实现。

代码(非递归):

class Solution(object):def inorderTraversal(self, root):stack=[root]#res=[]#结果列表while(stack):node = stack.pop()#栈,弹出if isinstance(node,TreeNode):#判断node是一个节点还是一具体值stack.extend([node.right,node.val,node.left])#重点elif isinstance(node,int):#如果是具体值res.append(node)#添加进结果列表return res

就是这么一段模板,可以去理解,但理解过后的几个月你又会忘掉(我就是这样)。直接从代码上来看,这段模板还是非常好记忆的。在一个栈里初始化我们的根节点root,不断地弹出栈,判断弹出元素的类型,如果是节点类型的话就按一定顺序把它的值和他的左右节点压入栈,如果是int类型的话,直接把值压入栈。

唯一要注意的一点是,我们这里是中序遍历,中序遍历的顺序是“左中右”,在这里我们压入栈的时候,要改成相反的顺序,即“右中左”。

同理,如果是前序遍历,本该是“中左右”,压入顺序是“右左中”;如果是后序遍历,本该是“左右中”,压入顺序是“中右左”,其他处代码一模一样。这就是这套非递归实现不同种遍历模板的强大之处,强烈建议记住。

二叉树的中序遍历 递归与非递归相关推荐

  1. 【数据结构笔记10】二叉树的先序、中序、后序遍历,中序遍历的堆栈/非递归遍历算法,层序遍历,确定一个二叉树,树的同构

    本次笔记内容: 3.3.1 先序中序后序遍历 3.3.2 中序非递归遍历 3.3.3 层序遍历 3.3.4 遍历应用例子 小白专场:题意理解及二叉树表示 小白专场:程序框架.建树及同构判别 文章目录 ...

  2. 编写非递归算法实现二叉树的中序遍历

    题目要求:编写非递归算法实现二叉树的中序遍历. 遍历代码: void InOrderTraverseNR(BiTree T) {SqStack stack;InitStack(&stack); ...

  3. 二叉树的中序遍历非递归方法(算法导论第三版12.1-3)

    二叉树的中序遍历非递归方法(算法导论第三版12.1-3) 1⃣️用栈实现 template<typename T> void inorder_tree_walk_non_recursion ...

  4. 二叉树的中序遍历 [递归 迭代]

    中序遍历的递归 & 迭代 前言 一.二叉树的中序遍历 二.递归 & 迭代 1.递归版 2.迭代(断左子树版) 3.迭代(root迭代版) 4.mirror(O(1)空间版) 总结 参考 ...

  5. 二叉树遍历之中序遍历算法(非递归、递归)入门详解

    一.引言 二叉树的遍历常见的方法有先序遍历.中序遍历.后序遍历和层次遍历等,本文给出了C语言版本的中序遍历二叉树的非递归算法和递归算法. 中序遍历的原理很简单,也就是把树根的访问放在中间.访问结点的次 ...

  6. LeetCode 92反转链表Ⅱ93复制ip地址94二叉树的中序遍历

    微信搜一搜:bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打卡群,欢迎 ...

  7. lintcode:二叉树的中序遍历

    题目: 二叉树的中序遍历 给出一棵二叉树,返回其中序遍历 样例 给出二叉树 {1,#,2,3}, 1\2/3 返回 [1,3,2]. 挑战 你能使用非递归算法来实现么? 解题: 程序直接来源 Java ...

  8. Leetcode 129求根节点到叶节点数字之和、104二叉树的最大深度、8字符串转换整数(atoi)、82删除排序链表中的重复元素II、204二分查找、94二叉树的中序遍历、144二叉树的前序遍历

    Top1:Leetcode 129求根节点到叶节点数字之和 官方题解:https://leetcode.cn/problems/sum-root-to-leaf-numbers/solution/qi ...

  9. 15 二叉树的中序遍历(Binary Tree Inorder Traversal)

    文章目录 1 题目 2 描述 3 解决方案 3.1 递归算法 3.1.1 遍历法(Traverse) 思路 源码 3.1.2 分治法(Devide And Conquer) 思路 源码 3.2 非递归 ...

最新文章

  1. java与.net比较学习系列(7) 属性
  2. 恕我直言,牛逼哄哄的MongoDB你可能只会30%
  3. 蚂蚁上市分给员工 7000 亿股权,曾有人 28 岁财务自由,这次又将产生多少千万富翁?...
  4. EXHCHANGE2003总结-2: 备份与还原
  5. Linux常用的基本命令01
  6. 竹笋炒肉 I18N和L10N
  7. 用java程序将GBK字符转成UTF-8编码格式(转)
  8. 新浪短网址生成java_如何生成t.cn的短链接?新浪短网址怎么生成的?
  9. Servlet实现登录注册
  10. s111 stark组件
  11. build.gradle里repositories的mavenCentral实现原理解析
  12. Windows 2000/XP中对窗口进行透明化
  13. Android 动态显示和隐藏软键盘
  14. 中国慢病管理行业市场形势调查分析及价值研究报告2021-2027年版
  15. python编写网络防火墙怎么设置_防火墙怎么设置?网络防火墙设置方法介绍
  16. 为Latex生成的PDF设置背景色
  17. Mac配置docker镜像源
  18. matlab中求x的y次幂,Matlab求关于x,y的三元函数的幂的拟合
  19. latex格式怎么引用文章
  20. 计算机学科论文期刊,计算机学科期刊文章参考文献 计算机学科论文参考文献数量是多少...

热门文章

  1. cannot be loaded because running scripts is disabled on this system
  2. 河北大学计算机改408,河北大学2020年硕士研究生招生调剂办法
  3. opengl进行绿色屏幕抠图
  4. 王传宝老师--宏观经济学家--金融研究专家---沪师经纪刘建
  5. 第二篇第一章概述及第二章生产和储存物品的火灾危险性分类 重点在于表格...
  6. 苹果m1可以虚拟服务器,苹果M1芯片可以运行ARM版win10 但需要利用虚拟机
  7. 关于unity场景切换后模型变黑问题
  8. win7用友u8安装教程_win7安装用友U8教程详解
  9. 小学认识计算机说课ppt,小学信息技术《认识word》说课稿
  10. linux uefi转mbr方法,如何将uefi改成mbr分区