开心一刻 一天,有个粉丝遇到感情方面的问题,找我出出主意 粉丝:我女朋友吧,就是先天有点病,听不到人说话,也说不了话,现在我家里人又给我介绍了一个,我该怎么办 我:这个问题很难去解释,我觉得一个人活着,他要对身边的人负责,对家人负责,对自己负责 从语音中我能感受得到粉丝很难受,我继续补充 我:我不是说让你放弃掉你的女朋友,你们一定是有一定的感情基础才在一起的,但你还是需要衡量衡量你的未来 我能明显感觉到粉丝已经在抽泣,继续说道 我:当然,这个时候离开肯定是不合适的,对吧? 粉丝:是的 我:这种感…
二叉树的遍历,先根遍历,不适用递归,存储空间为 O(1) 转自:http://chuansongme.com/n/100461 MorrisInOrder(): while 没有结束 如果当前节点没有左后代 // 则它就是最左了 所以 读取该点 访问该节点 转向右节点 否则 找到左后代的最右节点,且使最右节点的右指针指向当前节点 // 形成环,构造等以后读取完 本节点后,转向右节点再度的右节点 转向左后代节点 // 先处理到左下方向 void bst_morris_inorder(struct…
例题 中序遍历94. Binary Tree Inorder Traversal 先序遍历144. Binary Tree Preorder Traversal 后序遍历145. Binary Tree Postorder Traversal 递归栈 递归函数栈的方法很基础,写法也很简单,三种遍历方式之间只需要改变一行代码的位置即可 中序遍历 /** * Definition for a binary tree node. * struct TreeNode { * int val; * Tre…
 二叉树的Morris traversal是个很值得学习的算法,也是此系列重点想要记叙的一个算法.Morris traversal的一个亮点在于它是O(1)空间复杂度的.前面的递归和迭代都是需要O(n)空间复杂度的.那么这个O(1)空间复杂度怎样做到?这个借鉴了些线索二叉树的相关原理,Morris traversal通过在遍历时修改叶子节点的右孩子指针达到了回退到根节点的目的.Morris其实在原始论文中只给出了中序遍历的相关代码,但是依据这个思路,通过修改相关步骤,便可得到前序和后序的Morr…
在之前的博客中,博主讨论过二叉树的经典遍历算法,包括递归和常规非递归算法,其时间复杂度和空间复杂度均为O(n).Morris算法巧妙地利用了二叉树的线索化思路,将二叉树的遍历算法的空间复杂度降低为O(1),时间复杂度仍然为O(n).关于该算法的讨论在网上有很多,例如:http://www.cnblogs.com/AnnieKim/archive/2013/06/15/morristraversal.html,在这里,博主且讲讲自己的理解.各位看官可以结合本随笔和上面的帖子来加深对于Morris算…
本文主要解决一个问题,如何实现二叉树的前中后序遍历,有两个要求: 1. O(1)空间复杂度,即只能使用常数空间: 2. 二叉树的形状不能被破坏(中间过程允许改变其形状). 通常,实现二叉树的前序(preorder).中序(inorder).后序(postorder)遍历有两个常用的方法:一是递归 (recursive),二是使用栈实现的迭代版本(stack+iterative).这两种方法都是O(n)的空间复杂度(递归本身占用stack空 间或者用户自定义的stack),所以不满足要求.(用这两…
一篇质量非常高的关于二叉树遍历的帖子,转帖自http://noalgo.info/832.html 二叉树遍历(递归.非递归.Morris遍历) 2015年01月06日 |  分类:数据结构 |  标签:二叉树遍历 |  评论:8条评论 |  浏览:6,603次 二叉树遍历是二叉树中最基本的问题,其实现的方法非常多,有简单粗暴但容易爆栈的递归算法,还有稍微高级的使用栈模拟递归的非递归算法,另外还有不用栈而且只需要常数空间和线性时间的神奇Morris遍历算法,本文将对这些算法进行讲解和实现. 递归…
先看看线索二叉树 n个结点的二叉链表中含有n+1(2n-(n-1)=n+1)个空指针域.利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索"). 对于n个结点的二叉树,在二叉链存储结构中有n+1个空链域,利用这些空链域存放在某种遍历次序下该结点的前驱结点和后继结点的指针,这些指针称为线索,加上线索的二叉树称为线索二叉树. 概念 这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree).…
Morri遍历 通过利用空闲指针的方式,来节省空间.时间复杂度O(N),额外空间复杂度O(1).普通的非递归和递归方法的额外空间和树的高度有关,递归的过程涉及到系统压栈,非递归需要自己申请栈空间,都具有O(N)的额外空间复杂度. Morri遍历的原则: 1. 假设当前节点为cur, 2. 如果cur没有左孩子,cur向右移动,cur = cur.right 3. 如果cur有左孩子,找到左子树上最右的节点mostRight 3.1 如果mostRight.right == null,令mostR…
前置说明 不了解二叉树非递归遍历的可以看我之前的文章[数据结构与算法]二叉树模板及例题 Morris 遍历 概述 Morris 遍历是一种遍历二叉树的方式,并且时间复杂度O(N),额外空间复杂度O(1) .通过利用原树中大量空闲指针的方式,达到节省空间的目的 分析 设一棵二叉树有 n 个节点,则所有节点的指针域总和为 2 * n ,所有节点的非空指针域总和为 n - 1(非根节点被一个指针指向,根节点不被指针指向),所有节点的空指针域总和为 2n - (n - 1) = n + 1. 可以看到有…