遍历树的数据结构中最常见的操作。 能够说大部分关于树的题目都是环绕遍历进行变体来解决的。

一般来说面试中遇到树的题目是用递归来解决的, 只是假设直接考察遍历。 那么一般递归的解法就过于简单了。 面试官一般还会问很多其它问题, 比方非递归实现。 或者空间复杂度分析以及是否能优化等等。 树的遍历题目在LeetCode中有以下几个:

Binary Tree Inorder Traversal
Binary Tree Preorder Traversal
Binary Tree Postorder Traversal
Binary Tree Level Order Traversal
Binary Tree Level Order Traversal II
Binary Tree Zigzag Level Order Traversal

树的遍历基本上分成两种类型, 以下分别介绍:

第一种是以图的深度优先搜索为原型的遍历。 能够是中序。 先序和后序三种方式, 只是结点遍历的方式是同样的, 仅仅是訪问的时间点不同而已。 相应于Binary Tree Inorder Traversal, Binary Tree Preorder Traversal和Binary Tree Postorder Traversal这三道题目。 
在这样的类型中。 递归的实现方式是非常easy的, 仅仅须要递归左右结点, 直到结点为空作为结束条件就能够。 哪种序就取决于你訪问结点的时间。 
只是一般这不能满足面试官的要求, 可能会接着问能不能用非递归实现一下。 这个说起来比較简单, 事实上就是用一个栈手动模拟递归的过程。 Binary Tree Inorder Traversal和Binary Tree Preorder Traversal比較简单。 用一个栈来保存前驱的分支结点(相当于图的深度搜索的栈), 然后用一个结点来记录当前结点就能够了。 而Binary Tree Postorder Traversal则比較复杂一些。 保存栈和结点之后还得依据情况来推断当前应该走的方向(往左, 往右或者回溯)。 这里就不列举代码细节。 有兴趣的朋友能够看看详细题目的分析。 会更详细一些。 
有时候非递归还是不能满足面试官, 还会问一问, 上面的做法时间和空间复杂度是多少。

我们知道。 正常遍历时间复杂度是O(n), 而空间复杂度是则是递归栈(或者自己维护的栈)的大小。 也就是O(logn)。 好了, 他会问能不能够在常量空间内解决树的遍历问题呢? 确实还真能够, 这里就要介绍Morris Traversal的方法。

Morris遍历方法用了线索二叉树,这种方法不须要为每一个节点额外分配指针指向其前驱和后继结点,而是利用叶子节点中的右空指针指向中序遍历下的后继节点就能够了。 这样就节省了须要用栈来记录前驱或者后继结点的额外空间, 所以能够达到O(1)的空间复杂度。 只是这样的方法有一个问题就是会临时性的修改树的结构, 这在程序设计中并非非常好的习惯。 这些在面试中都能够和面试官讨论, 一般来说问到这里不会须要进行Morris遍历方法的代码实现了。 仅仅须要知道这样的方法和他的主要优劣势就能够了。 有兴趣知道实现的朋友能够看看详细题目的实现哈。

还有一种是以图的广度优先搜索为原型的, 在树中称为层序遍历。 LeetCode中有三种自顶向下层序, 自底向上层序和锯齿层序遍历。 相应于Binary Tree Level Order Traversal, Binary Tree Level Order Traversal II和Binary Tree Zigzag Level Order Traversal。 
Binary Tree Level Order Traversal事实上比較简单, 代码基本就是图的广度优先搜索, 思路就是维护一个队列存储上一层的结点, 逐层訪问。 而Binary Tree Level Order Traversal II则要从最后一层倒序訪问上来。 这个我没有想到太好的方法, 如今的实现就是把Binary Tree Level Order Traversal得到的层放入数据结构然后reverse过来, 确实没有太大的考核意义。

至于

Binary Tree Zigzag Level Order Traversal由于每一层訪问顺序有所改变, 并且是每次都反转顺序, 这让我们想到栈的数据结构, 所以这里不用队列对于上层结点进行。 而改用栈来保存, 就能够满足每层反转訪问顺序的要求了。

树的遍历是一个老生常谈的题目, 只是细致研究还是有一些考点的, 对于考查对数据结构和算法的理解还是不错的。 所以简单的东西也得重视哈。

LeetCode总结 -- 树的遍历篇相关推荐

  1. LeetCode 589. N-ary Tree Preorder Traversal-多子节点树前序遍历--递归,迭代--反向压栈--C++解法

    LeetCode 589. N-ary Tree Preorder Traversal-多子节点树前序遍历–递归,迭代–反向压栈–C++解法 LeetCode题解专栏:LeetCode题解 LeetC ...

  2. c#扩展方法奇思妙用高级篇七:“树”通用遍历器

    我的上一篇随笔<c#扩展方法奇思妙用高级篇六:WinForm 控件选择器>中给出了一个WinForm的选择器,其实质就是一个"树"的遍历器,但这个遍历局限于WinFor ...

  3. 【每日一题】Leetcode 刷题 二叉树-树的遍历 介绍

    二叉树-树的遍历 前序遍历 (根 左 右) 中序遍历 (左 根 右) 后序遍历 (左 右 根) 代码实现 前序遍历 中序遍历 后序遍历 完整代码 前序遍历 (根 左 右) 遍历顺序分别为: F B A ...

  4. DOM系列:DOM树和遍历DOM

    上一节,咱们整理了DOM系列中的第一篇,主要介绍浏览器与DOM相关的知识.从标题中我们可以看出来,今天所要学的东西包含两个部分,第一部分是DOM树,第二部分是遍历DOM.如果你和我一样对于DOM树和遍 ...

  5. 树-树的遍历(先序、中序、后序)

    树的遍历 树的遍历方式主要分为四种,先序.中序.后序和层序,在这篇博客中我将仔细介绍一下树的这四种遍历方式. 先序遍历 先序遍历,也叫先根遍历.前序遍历,首先访问根结点然后遍历左子树,最后遍历右子树. ...

  6. DSt:数据结构的简介、最强学习路线(逻辑结构【数组-链表-栈和队列/树-图-哈希】、物理结构、数据运算【十大排序/四大查找-图三大搜索-树三大遍历】、高级算法【贪心/分治/动态规划】之详细攻略

    DSt:数据结构的简介.最强学习路线(逻辑结构[数组-链表-栈和队列/树-图-哈希].物理结构[元素/关系].数据运算[十大排序/四大查找-图三大搜索-树三大遍历].高级算法[贪心/分治/动态规划]) ...

  7. Python 树的遍历

    文章目录 二叉树的遍历 前序遍历 递归 迭代 - 栈 中序遍历 递归 迭代 - 栈 莫里斯遍历 后序遍历 递归 迭代 - 栈 层序遍历 BFS-广度优先搜索 - 队列 层序遍历-BFS N叉树的遍历 ...

  8. mysql 遍历_MySQL 实现树的遍历详解及简单实现示例

    MySQL 实现树的遍历 经常在一个表中有父子关系的两个字段,比如empno与manager,这种结构中需要用到树的遍历.在Oracle 中可以使用connect by简单解决问题,但MySQL 5. ...

  9. 那些妖术——树的遍历

    本文参加CSDN博客大赛,如果你喜欢请投一票,非常感谢! 这个方法有点邪门,和大家在课堂上学的有点不一样,所以blog的名字取得有点邪乎. 一般的程序员应聘技术类的笔试都会有一道题目,那就是树的遍历( ...

最新文章

  1. 2018年视觉所有干货博文的分类汇总
  2. Golang内建库学习笔记(1)-sort和container
  3. Clojure语法学习-循环
  4. Spring Boot——WebMvcConfigurerAdapter已过时解决方案
  5. 字符串-判断数字的三个方法
  6. 静态链接库与动态链接库
  7. WiFi的STA和AP模式指什么?
  8. android自定义横向时间轴,Android自定义时间轴的实现过程
  9. 使用七牛实现静态页面的上传
  10. 2022-2027年中国衬衫行业市场调研及未来发展趋势预测报告
  11. python中求和公式是什么函数_python中求和函数怎么用
  12. 全志V853开发板硬件框图及各模块原理图【内附PDF版本】
  13. C/C++,定时关机代码和取消定时关机(应用范畴)
  14. 服务器cdm系统,CDM集群网站管理系统
  15. c# 收取邮件 解析_C# 接收邮件
  16. tableau计算之(三)表计算——分区/寻址——手动计算/快速计算
  17. CentOS7配置nexus开机自启动
  18. Science 封面 4 文连发:大脑分区不是功能关键!智慧从脑区间连接中诞生
  19. ⭐还记得10年前的微信小游戏【打飞机】吗?C语言实现!
  20. 任意文件下载、文件读取

热门文章

  1. 网管常犯的十个错误-转载
  2. 《数字视频和高清:算法和接口》一第1章 光 栅 图 像
  3. flannel 的连通与隔离 - 每天5分钟玩转 Docker 容器技术(61)
  4. linux 命令篇 -- 新建用户
  5. java内存模型 年轻代/年老代 持久区
  6. Class com.googlecode.jsonplugin.JSONWriter ca...
  7. 转型中的知不知、能不能、愿不愿
  8. IA-32系统编程指南 - 第三章 保护模式的内存管理【1】
  9. css transform旋转属性
  10. PAT1127 如何根据后序遍历中序遍历建树?