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

一般来说面试中遇到树的题目是用递归来解决的, 只是假设直接考察遍历。 那么一般递归的解法就过于简单了。 面试官一般还会问很多其它问题, 比方非递归实现。 或者空间复杂度分析以及是否能优化等等。 树的遍历题目在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 TraversalBinary Tree Postorder Traversal这三道题目。 
在这样的类型中。 递归的实现方式是非常easy的, 仅仅须要递归左右结点, 直到结点为空作为结束条件就能够。 哪种序就取决于你訪问结点的时间。 
只是一般这不能满足面试官的要求, 可能会接着问能不能用非递归实现一下。 这个说起来比較简单, 事实上就是用一个栈手动模拟递归的过程。 Binary Tree Inorder TraversalBinary 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 IIBinary 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总结 -- 树的性质篇

    树的性质推断是树的数据结构比較主要的操作,一般考到都属于非常easy的题目,也就是第一道入门题.面试中最好不能有问题,力求一遍写对.不要给面试官不论什么挑刺机会.LeetCode中关于树的性质有下面题 ...

  2. LeetCode总结 -- 树的求和篇

    树的求和属于树的题目中比較常见的,由于能够有几种变体,灵活度比較高,也能够考察到对于树的数据结构和递归的理解. 一般来说这些题目就不用考虑非递归的解法了(尽管事实上道理是跟LeetCode总结 -- ...

  3. 【LeetCode】树的遍历

    非递归中序遍历: 思路:注释 vector<int> inorderTraversal(TreeNode* root) { vector<int>ret; if(root == ...

  4. 数据结构--树(遍历,红黑,B树)

    平时接触树还比较少,写一篇博文来积累一下树的相关知识. 很早之前在数据结构里面学的树的遍历. 前序遍历:根节点->左子树->右子树 中序遍历:左子树->根节点->右子树 后序遍 ...

  5. LeetCode刷题总结-数组篇(上)

    数组是算法中最常用的一种数据结构,也是面试中最常考的考点.在LeetCode题库中,标记为数组类型的习题到目前为止,已累计到了202题.然而,这202道习题并不是每道题只标记为数组一个考点,大部分习题 ...

  6. LeetCode刷题总结-数组篇(中)

    本文接着上一篇文章<LeetCode刷题总结-数组篇(上)>,继续讲第二个常考问题:矩阵问题. 矩阵也可以称为二维数组.在LeetCode相关习题中,作者总结发现主要考点有:矩阵元素的遍历 ...

  7. LeetCode刷题总结-数组篇(下)

    本期讲O(n)类型问题,共14题.3道简单题,9道中等题,2道困难题.数组篇共归纳总结了50题,本篇是数组篇的最后一篇.其他三个篇章可参考: LeetCode刷题总结-数组篇(上),子数组问题(共17 ...

  8. L2-006 树的遍历 (层序遍历)

    根据访问根节点与左右子树的先后顺序,二叉树一般有三种遍历方式:先序遍历.中序遍历和后序遍历. 只要给定中序遍历序列与先序或后序中的一种,可以还原二叉树结构.学习数据结构课程时,一直都只会手动构建还原二 ...

  9. LeetCode:树专题

    树专题 参考了力扣加加对与树专题的讲解,刷了些 leetcode 题,在此做一些记录,不然没几天就没印象了 力扣加加-树专题 总结 树的定义 // Definition for a binary tr ...

随机推荐

  1. 使用GetInvocationList对委托链进行更多的控制

    委托链中所有项都会被调用,因为委托类型的 Invoke 方法包含了对数组中的所有项进行遍历的代码.这是一个很简单的算法.尽管这个简单的算法足以应付很多情形,但也有它的局限性.例如,除了最后一个返回值, ...

  2. C#将文件压缩成一个文件流,供前端下载

    直接上代码供大家参考... 前端页面就是一个下载的Button.. <body> <form id="form1" runat="server" ...

  3. VMWare linux安装mysql 5.7.13

    1.基础环境说明 虚拟机:VMWare 操作系统:linux 数据库版本:mysql 5.7.13 社区版(别问为什么不装企业版,因为企业版要钱) 背景:虚拟机可以连上外网 下载目录: /tools/ ...

  4. Redmine使用指南

    公司之前使用JIRA登bug,但是客户在美国,他们习惯于用Redmine登bug,所以我们也开始在Redmine登bug,找来一个比较全面的Redmine使用指南,不懂时直接查看. http://bl ...

  5. 08--MOOC--C/C++ 根据年月日计算星期几

    计算任何一天是星期几的几种算法 一:常用公式 W = [Y-1] + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D Y是年份数,D是这一天在这一年中的累积天数,也 ...

  6. JSP_内置对象_out

    out对象是JspWriter类的实例,是向客户端输出内容的常用对象,常用方法如下: void println() 向客户端打印字符串 void clear() 清除缓冲区的内容,如果在flush之后 ...

  7. Metadata

    元数据是关于数据的组织.数据域及其关系的信息,简言之,元数据就是关于数据的数据. Metadata is "data [information] that provides informat ...

  8. Steal 偷天换日 题解(From luoguBlog)

    树形+背包 奇奇怪怪的dp. 考试的时候费了半天劲把题读完后思路基本正解, 然而也不知道为什么脑子鬼畜了一下打了个非递归建树? 而且链式前向星建边? 岔路口和藏品都搞成节点? 自己给自己找麻烦Orz. ...

  9. React Native - 使用Geolocation进行定位(获取当前位置、监听位置变化)

    1,getCurrentPosition()方法介绍 static getCurrentPosition(geo_success, geo_error?, geo_options? 该方法用于获取当前 ...

  10. Nginx服务器部署SSL证书手机不信任解决方法

    在wosign申请证书并按指南正确部署证书后,如果发现PC浏览器访问正常,手机或safari浏览器提示证书不受信任,那肯定是在文件传输解压过程中导致证书文件中出现空格.乱码之类的情况,这里教您轻松四步 ...