那天做了个SWAP NODE的题,要求constant space,不得不Morris Traversal。

稍微研究了一下,真正意义上的O(1)space对二叉树进行遍历。好像是1979年的算法。

第一次看着挺乱的,智商严重不足,不得不在纸上画出来,一目了然。。。建议大家自己动手画一下。

每个没有右节点的Node要建1个辅助path,回到他来自的那个左节点的parent。很绕口= =然后第二次来到这个点的时候,要去掉这个Path。所以每个点都遍历了2次,时间上还是O(n)..

和那个树状数组有点像,以每个左节点为中心。

import java.util.*;

public class Morris {
public static class TreeNode {
int val;
TreeNode left;
TreeNode right; public TreeNode (int v) {
this.val = v;
left = null;
right = null;
}
} public static List<Integer> preOrder(TreeNode root) {
List<Integer> res = new ArrayList<>();
TreeNode temp = root;
while (temp != null) {
TreeNode morisTemp = temp;
if (temp.left != null) {
morisTemp = temp.left; while (morisTemp.right != null && morisTemp.right != temp) {
morisTemp = morisTemp.right;
} // first time, need to add a path
if (morisTemp.right == null) {
morisTemp.right = temp;
//res.add(temp.val); //pre-Order
temp = temp.left;
} else { // second time, remove the path we added,
morisTemp.right = null;
//res.add(temp.val); //in-Order
temp = temp.right;
} } else {
res.add(temp.val);
temp = temp.right;
}
} return res;
} public static void main(String[] args) {
TreeNode n10 = new TreeNode(10);
TreeNode n4 = new TreeNode(4);
TreeNode n1 = new TreeNode(1);
TreeNode n5 = new TreeNode(5);
TreeNode n3 = new TreeNode(3);
TreeNode n6 = new TreeNode(6);
TreeNode n12 = new TreeNode(12);
TreeNode n11 = new TreeNode(11);
TreeNode n14 = new TreeNode(14);
TreeNode n15 = new TreeNode(15); n10.left = n4;
n10.right = n12;
n4.left = n1;
n4.right = n5;
n5.left = n3;
n5.right = n6;
n12.left = n11;
n12.right = n14;
n14.left = n15; for (int i : preOrder(n10)) {
System.out.print(i + " ");
}
} }

preOrder和inOrder做出来了,postOrder有点麻烦,不会做= =再研究吧。。

Morris Traversal 二叉树遍历。的更多相关文章

  1. [转载]Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)

    本文主要解决一个问题,如何实现二叉树的前中后序遍历,有两个要求: 1. O(1)空间复杂度,即只能使用常数空间: 2. 二叉树的形状不能被破坏(中间过程允许改变其形状). 通常,实现二叉树的前序(pr ...

  2. Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)——无非是在传统遍历过程中修改叶子结点加入后继结点信息(传统是stack记录),然后再删除恢复

    先看看线索二叉树 n个结点的二叉链表中含有n+1(2n-(n-1)=n+1)个空指针域.利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索 ...

  3. Morris Traversal 方法遍历二叉树(非递归、不用栈,O(1)空间)

    http://www.cnblogs.com/AnnieKim/archive/2013/06/15/MorrisTraversal.html

  4. Morris Traversal方法遍历

    实现二叉树的遍历且只需要O(1)的空间. 参考:http://www.cnblogs.com/AnnieKim/archive/2013/06/15/MorrisTraversal.html

  5. 二叉树中序遍历,先序遍历,后序遍历(递归栈,非递归栈,Morris Traversal)

    例题 中序遍历94. Binary Tree Inorder Traversal 先序遍历144. Binary Tree Preorder Traversal 后序遍历145. Binary Tre ...

  6. C前序遍历二叉树Morris Traversal算法

    首先来递归算法,简单易懂: #include <stdio.h> #include <stdlib.h> #include <stdbool.h> typedef ...

  7. 额外空间复杂度O(1) 的二叉树遍历 → Morris Traversal,你造吗?

    开心一刻 一天,有个粉丝遇到感情方面的问题,找我出出主意 粉丝:我女朋友吧,就是先天有点病,听不到人说话,也说不了话,现在我家里人又给我介绍了一个,我该怎么办 我:这个问题很难去解释,我觉得一个人活着 ...

  8. [LeetCode] Binary Tree Inorder Traversal 二叉树的中序遍历

    Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tre ...

  9. 数据结构《10》----二叉树 Morris 中序遍历

    无论是二叉树的中序遍历还是用 stack 模拟递归, 都需要 O(n)的空间复杂度. Morris 遍历是一种 常数空间 的遍历方法,其本质是 线索二叉树(Threaded Binary Tree), ...

随机推荐

  1. JavaScript的问题

    定义一个函数function, function testParams() { var params = ""; for(var i=0; i<arguments.lengt ...

  2. 不能正确获得上次构建以来的Commit

    不能正确获得上次构建以来的Commit 如何解决?

  3. PHP正则表达式 验证电子邮件地址

    我们最经常遇到的验证,就是电子邮件地址验证.网站上常见.各种网页脚本也都常用“正则表达式”(regular expression)对我们输入的电子邮件地址进行验证,判断是否合法.有的还能分解出用户名和 ...

  4. Checbox的操作含已选、未选及判断代码

    Checbox的操作包括已选.未选.判断等等,下面有个不错的示例,使用jquery完成,感兴趣的朋友可以参考下 $("#chk1").attr("checked" ...

  5. Python 集合(set)使用

    1.python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差 ...

  6. 2015年9月29日 sql 触发器

    触发器(trigger):当有关联操作的时候使用(级联操作),属于ddl关键字. eg:下订单时,创建中的商品数量要减少:退票时,总的票数要增加.         在订单上建立触发器         ...

  7. Visual Studio Code扩展

    Visual Studio Code扩展 注:本文提到的代码示例下载地址>How to create a simple extension for VS Code VS Code 是微软推出的一 ...

  8. IntelliJ IDEA SVN的账号修改 信息清除

    来到编译器的setting设置 搜索subversion 点击subversion 找到下面的clear auth...按钮,点击一下 就可以了

  9. asp.net 登陆后在ashx处理程序中获取不到Session

    登录后存储Session,另一个页面Ajax请求 ashx页面,发现无法获取到Session,Session is NULL  使用“IReadOnlySessionState”这个接口就可以

  10. http://jinnianshilongnian.iteye.com/blog/1996071

    http://jinnianshilongnian.iteye.com/blog/1996071 http://my.oschina.net/jkcui/blog/388400 http://tian ...