在树的深度优先遍历中(包括前序、中序、后序遍历),递归方法最为直观易懂,但考虑到效率,我们通常不推荐使用递归。

栈迭代方法虽然提高了效率,但其嵌套循环却非常烧脑,不易理解,容易造成“一看就懂,一写就废”的窘况。而且对于不同的遍历顺序(前序、中序、后序),循环结构差异很大,更增加了记忆负担。

因此,我在这里介绍一种“灰白标记法”,兼具栈迭代方法的高效,又像递归方法一样简洁易懂,更重要的是,这种方法对于前序、中序、后序遍历,能够写出完全一致的代码。

其核心思想如下:

使用颜色标记节点的状态,新节点为白色,已访问的节点为灰色。
如果遇到的节点为白色,则将其标记为灰色,然后将其右子节点、自身、左子节点依次入栈。
如果遇到的节点为灰色,则将节点的值输出。
使用这种方法实现的中序遍历如下:

class Solution:def inorderTraversal(self, root: TreeNode) -> List[int]:WHITE, GRAY = 0, 1res = []stack = [(WHITE, root)]while stack:color, node = stack.pop()if node is None: continueif color == WHITE:stack.append((WHITE, node.right))stack.append((GRAY, node))stack.append((WHITE, node.left))else:res.append(node.val)return res

优化:

white对应TreeNode数据类型,gray对应int数据类型,所以不需要额外的颜色标记:

class Solution:def inorderTraversal(self, root: TreeNode) -> List[int]:stack,res = [root],[]while stack:p = stack.pop()if isinstance(p,TreeNode):stack.extend([p.right,p.val,p.left])elif isinstance(p,int):res.append(p)return res

python二叉树的非递归遍历相关推荐

  1. 刷题:二叉树的非递归遍历方式

    二叉树的非递归的遍历方式 上篇博客记录了二叉树的递归遍历方式以及根据二叉树的遍历结果还原二叉树的内容. 本篇博客记录二叉树的非递归的遍历方式. 二叉树的非递归遍历需要借助栈来实现,而且三种遍历的方式的 ...

  2. 二叉树的非递归遍历(c/c++)

    由于递归算法相对于非递归算法来说效率通常都会更低,递归算法会有更多的资源需要压栈和出栈操作(不仅仅是参数,还有函数地址等)由于编译器对附加的一些栈保护机制会导致递归执行的更加低效,使用循环代替递归算法 ...

  3. 二叉树的非递归遍历(统一的模板)

    二叉树的非递归遍历 前言 树的存储结构 先序遍历 先序的递归遍历 先序的非递归遍历 中序遍历 中序的递归遍历 中序遍历的非递归算法 后序遍历 后序的递归遍历 后序的非递归遍历 层次遍历 层次遍历获得每 ...

  4. 数据结构-二叉树的非递归遍历

    前面的章节我们实现了二叉树最基本的遍历方式:递归遍历,代码是如此的简洁:辣么我们为什么还要去学习二叉树的非递归遍历方式呢?众所周知,递归优点是将可以将复杂的问题简单化即大问题拆分成一个个小问题,那么它 ...

  5. c语言以顺序结构存储的二叉树的非递归遍历,C语言二叉树的非递归遍历实例分析...

    本文以实例形式讲述了C语言实现二叉树的非递归遍历方法.是数据结构与算法设计中常用的技巧.分享给大家供大家参考.具体方法如下: 先序遍历: void preOrder(Node *p) //非递归 { ...

  6. 树:二叉树的非递归遍历算法

    二叉树的递归遍历 二叉树的递归遍历算法,写法很简单,比如说前序遍历树,如下: //前序遍历 void PreOrderTraverse(BiTree tree) {if (NULL != tree){ ...

  7. 6-9 二叉树的非递归遍历 (20 分)

    ** 6-9 二叉树的非递归遍历 (20 分) ** 本题要求用非递归的方法实现对给定二叉树的 3 种遍历. 函数接口定义: void InorderTraversal( BinTree BT ); ...

  8. C/C++ 二叉树的非递归遍历(前序、中序、后序非递归遍历)

     二叉树的非递归遍历C/C++实现:   非递归先序遍历代码: void PreOrderTraversal (struct tree* root) { //非递归先序遍历struct tree* t ...

  9. C语言实现二叉树的非递归遍历

    C语言实现二叉树的非递归遍历: 代码解释: 非递归前序遍历:1> 首先建立一个二维指针,用来存储每个结点的地址,定义栈顶指针top,初始值为-1,并将根结点存入栈中,top++:2> 进入 ...

  10. 二叉树的非递归遍历(C语言实现)

    上一篇讨论了二叉树的的递归遍历,这一次讨论二叉树的三种非递归遍历 二叉树的非递归遍历采用栈实现,首先给出二叉树和栈的定义 #define STACK_INIT_SIZE 100 #define STA ...

最新文章

  1. AI开学第一课!CMU深度学习秋季课程开课了(附PPT 、视频)
  2. Linux -- userdel
  3. jstl java_JSTL-Java-Baby-51CTO博客
  4. java metrics 简书_Metrics 入门文档翻译
  5. 解决Jenkins的job启动tomcat时会在job结束时关闭问题
  6. uva 1451——Average
  7. 20155320 第十一周课堂总结
  8. APP 控制 ROS 机器人 群组
  9. 谈谈JavaScript的ECMA5中forEach
  10. PML调用PDMS内核命令研究
  11. matlab训练cifar10,认识CIFAR-10数据集
  12. linux java bin 安装_linux下安装后缀为bin的Java JDK
  13. .NET-C#超文本编辑器FreeTextBox使用
  14. 包含服务器数据库的聊天系统,聊天服务器数据库
  15. 高分七号卫星发射成功
  16. 【教程】手把手教你做外卖红包推广返利公众号搭建
  17. Google Play App送审被拒-违反权限政策
  18. 【SDOI2015】星际战争 网络流
  19. android 接电话 返回后黑屏,安卓手机打电话黑屏原因和解决方法
  20. 南京美食,为吃遍天下做准备~~

热门文章

  1. 信用评分模型详解(上)之 评分卡模型
  2. 【C++ 开根号和平方运算】
  3. 算法:二叉平衡树(AVL树)
  4. 趣头条自媒体审核不过怎么办,趣头条伪原创工具教程
  5. STM32----矩阵按键
  6. 专门查英语单词的软件_查英语单词的工具
  7. 图像检索与识别(Bag-Of-Words Models)
  8. 时间序列数据挖掘综述
  9. xps13 9360黑苹果
  10. d3.js 旋转图形_PROE、Creo绘制手轮图形案例,二维草图绘制练习项目