讲在前面的话,网上一搜遍历二叉树出来的结果真的是良莠不齐,简直不能忍啊,很多前序、中序、后序遍历分别用三个结构不一样的算法来描述,这谁能顶得住啊!!!遍历二叉树代码,看一篇博客就够了。

1.二叉树遍历分类:

  一般我们二叉树分为前序、中序、后序遍历(说明:本文不包括层次遍历),假设用L、D、R分别表示遍历左子树、访问根节点、遍历右子树,前序、中序、后序遍历可以分别表示为DLR、LDR、LRD(一定要记住这个顺序,在后面的代码中很重要!!)。

  算法一般分为递归版本和迭代版本,下面都给出这两个版本的python代码,所有代码都测试通过。

2.talk is easy, show me the code

2.1递归版的二叉树前序、中序、后序遍历

前序遍历:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution:def preorderTraversal(self, root: TreeNode) -> List[int]:if not root:return []return [root.val] + self.preorderTraversal(root.left) + self.preorderTraversal(root.right)

中序遍历:

class Solution:def inorderTraversal(self, root: TreeNode) -> List[int]:if not root:return []return self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)

后序遍历:

class Solution:def postorderTraversal(self, root: TreeNode) -> List[int]:if not root:return []return self.postorderTraversal(root.left) + self.postorderTraversal(root.right) +  [root.val] 

发现规律没,只需要改变在代码中改变L、D、R的操作就可以了(开头已经定义过的)。

2.2迭代版的二叉树前序、中序、后序遍历

非递归的二叉树遍历思想主要是用栈和标志来不断的压栈和退栈,自己照着代码压一次栈就什么都明白了。

前序遍历:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution:def preorderTraversal(self, root: TreeNode) -> List[int]:stack = []stack.append((0, root))res = []while len(stack) != 0:flag, node = stack.pop()if node is None:continueif flag == 1:res.append(node.val)else:stack.append((0, node.right)) #DLR right最先压入堆栈,然后依次是LDstack.append((0, node.left))stack.append((1, node))return res 

中序遍历:

class Solution:def inorderTraversal(self, root: TreeNode) -> List[int]:stack = []stack.append((0, root))res = []while len(stack) != 0:flag, node = stack.pop()if node is None:continueif flag == 1:res.append(node.val)else:stack.append((0, node.right)) #LDR right最先压入堆栈,然后依次是DLstack.append((1, node))stack.append((0, node.left))return res

后序遍历:

class Solution:def postorderTraversal(self, root: TreeNode) -> List[int]:stack = []stack.append((0, root))res = []while len(stack) != 0:flag, node = stack.pop()if node is None:continueif flag == 1:res.append(node.val)else:stack.append((1, node))      #LRD D最先压入堆栈,然后依次是RLstack.append((0, node.right))stack.append((0, node.left))return res

又发现规律没,只需要改变最后stack的压入的顺序就可以应付三种遍历算法,简直完美。秒杀其他算法。

遍历二叉树,一篇博客就够了相关推荐

  1. 从0到掌握Java泛型有这一篇博客就够了

    1.泛型的概述 2.泛型类 2.泛型接口 4.泛型方法 5.泛型通配符 6.泛型数组 1.泛型的概述 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的&quo ...

  2. Docker学习,这一篇博客就够了

    容器简介 什么是 Linux 容器 Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件. 容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试 ...

  3. CSDN博客写文章如何选择封面,看完这篇博客就够了(数千字手把手教学)

    作者:Yu仙笙真滴卷 专栏:个人心得 I like purple,haha

  4. python博客项目评论_Python 爬虫入门——小项目实战(自动私信博客园某篇博客下的评论人,随机发送一条笑话,完整代码在博文最后)...

    之前写的都是针对爬虫过程中遇到问题的解决方案,没怎么涉及到实际案例.这次,就以博客园为主题,写一个自动私信博客下的评论人员(在本篇留下的评论的同学也会被自动私信,如果不想被私信,同时又有问题,请私信我 ...

  5. 自定义依赖注解无效_关于Apt注解实践与总结【包含20篇博客】

    超详细!安卓巴士开发者大会嘉宾及主题介绍 目录介绍 00.注解系列博客汇总 01.什么是apt 02.annotationProcessor和apt区别 03.项目目录结构 04.该案例作用 05.使 ...

  6. 关于Apt注解实践与总结【包含20篇博客】

    YCApt关于apt方案实践与总结 目录介绍 00.注解系列博客汇总 01.什么是apt 02.annotationProcessor和apt区别 03.项目目录结构 04.该案例作用 05.使用说明 ...

  7. python 图像变化检测_Python OpenCV 霍夫(Hough Transform)直线变换检测原理,图像处理第 33 篇博客...

    Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧.本篇博客是这个系列的第 33 篇. 基础知识铺垫 霍夫变换(Hough Transform)是图像处理领域中,从图像中识别几 ...

  8. Excel VBA实现从多篇Word文档内抓取文本框内内容(书接上一篇博客)

    Excel VBA实现从多篇Word文档内抓取文本框内内容(书接上一篇博客) 一.前情提要 我在上一篇博客<VBA摘取Word图形(Shapes)内文字>里验证了遍历doc文档内图形--尤 ...

  9. 3. 你也要写技术博客?这篇博客告诉你平台怎么选

    橡皮擦,一个逗趣的互联网高级网虫,为你带来新职场故事,搬来程序员敲门砖. 已完成文章 国内,首套,成体系,技术博客写作专栏发布啦 技术博客只能写技术文章吗?当然是由我们自己来定义. 为"她& ...

最新文章

  1. 使用多线程还是用IO复用select/epoll? epoll 或者 kqueue 的原理是什么?
  2. 越来越多BCH全节点客户端对BCH意味着什么?
  3. 无法创建Web Application项目的问题
  4. 08--MySQL自学教程:DQL(数据库查询)字段控制查询、聚合函数、分组查询、limit(二)
  5. mysql中char与varchar的区别分析
  6. php定位符,行定位符、单词定界符实例用法(正则表达式字符集1)
  7. cornerstone the working copy is locked due to a previous文件lock解决办法
  8. 把JS和CSS合并到1个文件
  9. CCF201609-1 最大波动(100分)
  10. Chladni Figure CodeForces - 1162D (暴力,真香啊~)
  11. 扫雷游戏网页版_佛性扫雷 炸不炸随缘
  12. 86版五笔-字根速记
  13. 绘制风向、风速玫瑰图
  14. 《阿里铁军》的读后感范文3700字
  15. 如何在Mac上恢复未保存的word文档
  16. ssc335调试isp记录之色彩篇
  17. python图像隐写_【快速跟水】图像隐写的python实现
  18. 多线程设计模式-主仆模式
  19. 在单核CPU下,有必要存在多线程吗?
  20. 【C/C++学习】之STL详解

热门文章

  1. ERP商业计划书模版
  2. 爬虫练习-爬取豆瓣音乐TOP250的数据
  3. 辽宁丰睿佳业科技有限公司:抖音小店精选联盟免费入驻流程?
  4. 【每日新闻】微软悄然删除世界上最大的公共人脸识别数据库
  5. cxfreeze打包工程文件生成.exe,运行exe出现闪退问题,相关解决办法总结
  6. PM的自我修养——关于AndroidDesign的一些基础知识
  7. 邮件群发之一封邮件发给多个收件人?抄送密送设置
  8. JSP之forEach标签
  9. OVS常用命令与使用总结
  10. pytorch 实现 GRL Gradient Reversal Layer