LeetCode总结 -- 树的遍历篇
一般来说面试中遇到树的题目是用递归来解决的, 只是假设直接考察遍历。 那么一般递归的解法就过于简单了。 面试官一般还会问很多其它问题, 比方非递归实现。 或者空间复杂度分析以及是否能优化等等。 树的遍历题目在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总结 -- 树的遍历篇的更多相关文章
- LeetCode总结 -- 树的性质篇
树的性质推断是树的数据结构比較主要的操作,一般考到都属于非常easy的题目,也就是第一道入门题.面试中最好不能有问题,力求一遍写对.不要给面试官不论什么挑刺机会.LeetCode中关于树的性质有下面题 ...
- LeetCode总结 -- 树的求和篇
树的求和属于树的题目中比較常见的,由于能够有几种变体,灵活度比較高,也能够考察到对于树的数据结构和递归的理解. 一般来说这些题目就不用考虑非递归的解法了(尽管事实上道理是跟LeetCode总结 -- ...
- 【LeetCode】树的遍历
非递归中序遍历: 思路:注释 vector<int> inorderTraversal(TreeNode* root) { vector<int>ret; if(root == ...
- 数据结构--树(遍历,红黑,B树)
平时接触树还比较少,写一篇博文来积累一下树的相关知识. 很早之前在数据结构里面学的树的遍历. 前序遍历:根节点->左子树->右子树 中序遍历:左子树->根节点->右子树 后序遍 ...
- LeetCode刷题总结-数组篇(上)
数组是算法中最常用的一种数据结构,也是面试中最常考的考点.在LeetCode题库中,标记为数组类型的习题到目前为止,已累计到了202题.然而,这202道习题并不是每道题只标记为数组一个考点,大部分习题 ...
- LeetCode刷题总结-数组篇(中)
本文接着上一篇文章<LeetCode刷题总结-数组篇(上)>,继续讲第二个常考问题:矩阵问题. 矩阵也可以称为二维数组.在LeetCode相关习题中,作者总结发现主要考点有:矩阵元素的遍历 ...
- LeetCode刷题总结-数组篇(下)
本期讲O(n)类型问题,共14题.3道简单题,9道中等题,2道困难题.数组篇共归纳总结了50题,本篇是数组篇的最后一篇.其他三个篇章可参考: LeetCode刷题总结-数组篇(上),子数组问题(共17 ...
- L2-006 树的遍历 (层序遍历)
根据访问根节点与左右子树的先后顺序,二叉树一般有三种遍历方式:先序遍历.中序遍历和后序遍历. 只要给定中序遍历序列与先序或后序中的一种,可以还原二叉树结构.学习数据结构课程时,一直都只会手动构建还原二 ...
- LeetCode:树专题
树专题 参考了力扣加加对与树专题的讲解,刷了些 leetcode 题,在此做一些记录,不然没几天就没印象了 力扣加加-树专题 总结 树的定义 // Definition for a binary tr ...
随机推荐
- 通过委托事件实现winform窗体之间的互相刷新
新建winform窗体Form1和Form2; 接下来要通过点击Form2的按钮,实现Form1界面的同步刷新. 先展示一下最终效果: 1.Form1界面如下: 2.点击按钮弹出Form2,界面如下: ...
- Asp.net MVC4 Step by Step (2)-参数数据的传递
首先创建一个表单,不同于WebForm,框架提供了一系列HMTL帮助方法来生成HTML标签. 下面创建一个Create.cshtml为文件名的视图. <h2> Create Auction ...
- 去除DialogFragment的背景阴影,背景色,标题栏
style中: <resources xmlns:android="http://schemas.android.com/apk/res/android"> <s ...
- servlet-后台获取form表单传的参数
前台代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> & ...
- C# 获取正在使用的Mac地址
/// <summary> /// 获得当前机器的活动中Mac地址,若无联网则返回空"" /// 需在项目引用中添加 System.Management /// < ...
- 红黑联盟 php相关资讯
http://www.2cto.com/tag/phpbanben.html
- excel 处理方法
//.方法一:采用OleDB读取EXCEL文件: //打开excel 返回指定表中的所有数据 public DataSet ExcelToDS(string Path) { string strCon ...
- python tips:最内嵌套作用域规则,闭包与装饰器
在作用域与名字空间提到,python是静态作用域,变量定义的位置决定了变量作用的范围.变量沿着local,global,builtins的路径搜索,直觉上就是从里到外搜索变量,这称为最内嵌套作用域规则 ...
- JSLinq 的使用
在net 中经常使用Linq 语法或者lamada 表达式,在使用的过程中感觉很方便,但是在涉及到JS的时候,总要自己去写逻辑代码去查询相关数据,通过搜索发现 已经有关于JSLInq的扩展方法,可以像 ...
- luogu P4238 多项式求逆 (模板题、FFT)
手动博客搬家: 本文发表于20181125 13:21:46, 原地址https://blog.csdn.net/suncongbo/article/details/84485718 题目链接: ht ...