二叉树的中序遍历 递归与非递归
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类型的话,直接把值压入栈。
唯一要注意的一点是,我们这里是中序遍历,中序遍历的顺序是“左中右”,在这里我们压入栈的时候,要改成相反的顺序,即“右中左”。
同理,如果是前序遍历,本该是“中左右”,压入顺序是“右左中”;如果是后序遍历,本该是“左右中”,压入顺序是“中右左”,其他处代码一模一样。这就是这套非递归实现不同种遍历模板的强大之处,强烈建议记住。
二叉树的中序遍历 递归与非递归相关推荐
- 【数据结构笔记10】二叉树的先序、中序、后序遍历,中序遍历的堆栈/非递归遍历算法,层序遍历,确定一个二叉树,树的同构
本次笔记内容: 3.3.1 先序中序后序遍历 3.3.2 中序非递归遍历 3.3.3 层序遍历 3.3.4 遍历应用例子 小白专场:题意理解及二叉树表示 小白专场:程序框架.建树及同构判别 文章目录 ...
- 编写非递归算法实现二叉树的中序遍历
题目要求:编写非递归算法实现二叉树的中序遍历. 遍历代码: void InOrderTraverseNR(BiTree T) {SqStack stack;InitStack(&stack); ...
- 二叉树的中序遍历非递归方法(算法导论第三版12.1-3)
二叉树的中序遍历非递归方法(算法导论第三版12.1-3) 1⃣️用栈实现 template<typename T> void inorder_tree_walk_non_recursion ...
- 二叉树的中序遍历 [递归 迭代]
中序遍历的递归 & 迭代 前言 一.二叉树的中序遍历 二.递归 & 迭代 1.递归版 2.迭代(断左子树版) 3.迭代(root迭代版) 4.mirror(O(1)空间版) 总结 参考 ...
- 二叉树遍历之中序遍历算法(非递归、递归)入门详解
一.引言 二叉树的遍历常见的方法有先序遍历.中序遍历.后序遍历和层次遍历等,本文给出了C语言版本的中序遍历二叉树的非递归算法和递归算法. 中序遍历的原理很简单,也就是把树根的访问放在中间.访问结点的次 ...
- LeetCode 92反转链表Ⅱ93复制ip地址94二叉树的中序遍历
微信搜一搜:bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打卡群,欢迎 ...
- lintcode:二叉树的中序遍历
题目: 二叉树的中序遍历 给出一棵二叉树,返回其中序遍历 样例 给出二叉树 {1,#,2,3}, 1\2/3 返回 [1,3,2]. 挑战 你能使用非递归算法来实现么? 解题: 程序直接来源 Java ...
- Leetcode 129求根节点到叶节点数字之和、104二叉树的最大深度、8字符串转换整数(atoi)、82删除排序链表中的重复元素II、204二分查找、94二叉树的中序遍历、144二叉树的前序遍历
Top1:Leetcode 129求根节点到叶节点数字之和 官方题解:https://leetcode.cn/problems/sum-root-to-leaf-numbers/solution/qi ...
- 15 二叉树的中序遍历(Binary Tree Inorder Traversal)
文章目录 1 题目 2 描述 3 解决方案 3.1 递归算法 3.1.1 遍历法(Traverse) 思路 源码 3.1.2 分治法(Devide And Conquer) 思路 源码 3.2 非递归 ...
最新文章
- java与.net比较学习系列(7) 属性
- 恕我直言,牛逼哄哄的MongoDB你可能只会30%
- 蚂蚁上市分给员工 7000 亿股权,曾有人 28 岁财务自由,这次又将产生多少千万富翁?...
- EXHCHANGE2003总结-2: 备份与还原
- Linux常用的基本命令01
- 竹笋炒肉 I18N和L10N
- 用java程序将GBK字符转成UTF-8编码格式(转)
- 新浪短网址生成java_如何生成t.cn的短链接?新浪短网址怎么生成的?
- Servlet实现登录注册
- s111 stark组件
- build.gradle里repositories的mavenCentral实现原理解析
- Windows 2000/XP中对窗口进行透明化
- Android 动态显示和隐藏软键盘
- 中国慢病管理行业市场形势调查分析及价值研究报告2021-2027年版
- python编写网络防火墙怎么设置_防火墙怎么设置?网络防火墙设置方法介绍
- 为Latex生成的PDF设置背景色
- Mac配置docker镜像源
- matlab中求x的y次幂,Matlab求关于x,y的三元函数的幂的拟合
- latex格式怎么引用文章
- 计算机学科论文期刊,计算机学科期刊文章参考文献 计算机学科论文参考文献数量是多少...
热门文章
- cannot be loaded because running scripts is disabled on this system
- 河北大学计算机改408,河北大学2020年硕士研究生招生调剂办法
- opengl进行绿色屏幕抠图
- 王传宝老师--宏观经济学家--金融研究专家---沪师经纪刘建
- 第二篇第一章概述及第二章生产和储存物品的火灾危险性分类 重点在于表格...
- 苹果m1可以虚拟服务器,苹果M1芯片可以运行ARM版win10 但需要利用虚拟机
- 关于unity场景切换后模型变黑问题
- win7用友u8安装教程_win7安装用友U8教程详解
- 小学认识计算机说课ppt,小学信息技术《认识word》说课稿
- linux uefi转mbr方法,如何将uefi改成mbr分区