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

一般来说面试中遇到树的题目是用递归来解决的, 只是假设直接考察遍历。 那么一般递归的解法就过于简单了。 面试官一般还会问很多其它问题, 比方非递归实现。 或者空间复杂度分析以及是否能优化等等。 树的遍历题目在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. NSLayoutConstraints加动画来改变约束

    // // ViewController.m // NSLayoutAnimationDemo // // Created by ebaotong on 15/7/22. // Copyright ( ...

  2. java 发送http请求

    参考别人的 package test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputS ...

  3. Step by Step 开发dynamics CRM

    这里是作为开发贴的总结. 现在plugin和workflow系列已经终结. 希望这些教程能给想入坑的小伙伴一些帮忙. CRM中文教材不多, 我会不断努力为大家提供更优质的教程. Plugin 开发系列 ...

  4. 基于MATLAB的多功能语音处理器

    一.设计功能 录制音频,保存音频 对录制的语音信号进行频谱分析,确定该段语音的主要频率范围: 利用采样定理,对该段语音信号进行采样,观察不用采样频率(过采样.欠采样.临界采样)对信号的影响: 实现语音 ...

  5. 绝对好用的浏览器json解析网址

    你们是否经常在浏览器输入请求地址解析遇到中文乱码的情况,今天我找到了一个好用的浏览器解析json网址,绝对好用. 1.直接输入网址 http://pro.jsonlint.com/ 2.输入要解析的j ...

  6. let、var、const用法区别

    1.var var 声明的变量为全局变量,并会进行变量提升:也可以只声明变量而不进行赋值,输出为undefined,以下写法都是合法的. var a var a = 123  2.let let 声明 ...

  7. 【JavaScript】通过封装自己的JSONP解决浏览器的跨域问题(Ajax跨域)

    问题引出:要发送Ajax请求,就必须使用HTTP请求?什么是跨域问题? 什么是跨域问题:如果两个页面中的协议.域名.端口.子域名任意有一项不同,两者之间所进行的访问行动就是跨域的,而浏览器为了安全问题 ...

  8. [jzoj 5770]【2018提高组模拟A组8.6】可爱精灵宝贝 (区间dp)

    传送门 Description Branimirko是一个对可爱精灵宝贝十分痴迷的玩家.最近,他闲得没事组织了一场捉精灵的游戏.游戏在一条街道上举行,街道上一侧有一排房子,从左到右房子标号由1到n. ...

  9. HTML学习笔记之基本介绍

    超文本标记语言 (Hyper Text Markup Language,HTML)不是一种编程语言,而是一种标记语言,用一套标记标签描述网页 HTML 标记标签又被称为 HTML 标签(HTML Ta ...

  10. 3.在eclipse中创建Web项目,并部署到Tomcat上

    1.找到创建web项目的菜单 2.创建web项目并选择web环境 3.查看创建好的web项目结构 4.在web项目的webContent文件夹下创建jsp页面 5.查看是否创建jsp页面成功,并编辑j ...