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

一般来说面试中遇到树的题目是用递归来解决的, 只是假设直接考察遍历。 那么一般递归的解法就过于简单了。 面试官一般还会问很多其它问题, 比方非递归实现。 或者空间复杂度分析以及是否能优化等等。 树的遍历题目在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. HTML <!DOCTYPE>标签 各版本对应的标签是否有无

    参考来源: http://www.w3school.com.cn/tags/html_ref_dtd.asp HTML5/HTML 4.01/XHTML 元素和有效的 DTD 下面的表格列出了所有的 ...

  2. java 实现将java对象转为yaml文件

    首先我们建两个类,以下两个类展示的是一个学生拥有多个手机号码联系人. 先是学生类: package com.ming.yaml.beans; import java.util.ArrayList; i ...

  3. 第二章 API的理解和使用

    2.1.1全局命令 Key * 查看所有键,(慎用,会把所有键都遍历一次并列出) Dbsize 查看键总数,不会遍历所有键,只是从内置函数中读取一个数 Exists [key] 检查键是否存在 Del ...

  4. 利用ProgressBar实现旋转loading动画

    1.res\anim.loading.xml <?xml version="1.0" encoding="utf-8"?> <LinearLa ...

  5. php判断方法及区别

    php判断方法 ‘is_类型名称’    php判断方法 $x="1"; echo gettype(is_string($x)); isset    是否存在 empty   是否 ...

  6. js 字符串 处理方法

    charAt() 返回指定索引位置的字符 charCodeAt() 返回指定索引位置字符的 Unicode 值 concat() 连接两个或多个字符串,返回连接后的字符串 fromCharCode() ...

  7. APICloud 获取缓存以及清除缓存(常用第三方方法)

    一.app中经常会有缓存的清除这个操作,具体如下 1.获取缓存大小 apiready = function() { api.getCacheSize(function(ret, err) { //si ...

  8. day34-3 类和对象小知识

    目录 属性查找顺序 类与对象的绑定方法 类与数据类型 对象的高度整合 属性查找顺序 属性查找顺序:先从对象自身查找,对象没有就去类中查找,类中没有则报错 class Student: name = ' ...

  9. LINUX - getopts

    getopts optionString opt; optionString :所有参数组成的-参数串: opt:从optionString 每次取的参数值: 当optionString用[:]开头, ...

  10. jquery获取当前时间并且格式化

    Date.prototype.Format = function (fmt) {      var o = {          "M+": this.getMonth() + 1 ...