题目

遍历二叉树的神级方法 morris

java代码

package com.lizhouwei.chapter3;

/**
* @Description:遍历二叉树的神级方法 morris
* @Author: lizhouwei
* @CreateDate: 2018/4/14 17:15
* @Modify by:
* @ModifyDate:
*/
public class Chapter3_5 {
//morris中序
public void morrisInOrder(Node head) {
Node cur1 = head;
Node cur2 = null;//左子节点
while (cur1 != null) {
cur2 = cur1.left;//当前节点的左子节点
if (cur2 != null) {
//循环遍历到左子节点的最右子节点
while (cur2.right != null && cur2.right != cur1) {
cur2 = cur2.right;
}
//如过最右节点未指向cur1,则使之指向cur1,并略过后续代码;
if (cur2.right == null) {
cur2.right = cur1;
cur1 = cur1.left;
continue;
} else {
//如过最右节点已指向cur1,恢复,则使之指向null,
cur2.right = null;
}
}
//如果cur1.left 为null,则说明没有左子树,则开始打印父节点;
System.out.print(cur1.value + " ");
cur1 = cur1.right;
}
System.out.println();
} //morris前序
public void morrisPreOrder(Node head) {
Node cur1 = head;
Node cur2 = null;//左子节点
while (cur1 != null) {
cur2 = cur1.left;//当前节点的左子节点
if (cur2 != null) {
//循环遍历到左子节点的最右子节点
while (cur2.right != null && cur2.right != cur1) {
cur2 = cur2.right;
}
//如过最右节点未指向cur1,则使之指向cur1,并略过后续代码;
if (cur2.right == null) {
cur2.right = cur1;
System.out.print(cur1.value + " ");//遇见父节点,先打印父节点
cur1 = cur1.left;
continue;
} else {
//如过最右节点已指向cur1,恢复,则使之指向null,
cur2.right = null;
}
} else {
//如果cur1.left 为null,说明没有左子节点,在切换到右子树之前先打印父节点
System.out.print(cur1.value + " ");
}
cur1 = cur1.right;
}
System.out.println();
} //morris后序
public void morrisPostOrder(Node head) {
Node cur1 = head;
Node cur2 = null;//左子节点
while (cur1 != null) {
cur2 = cur1.left;//当前节点的左子节点
if (cur2 != null) {
//循环遍历到左子节点的最右子节点
while (cur2.right != null && cur2.right != cur1) {
cur2 = cur2.right;
}
//如过最右节点未指向cur1,则使之指向cur1,并略过后续代码;
if (cur2.right == null) {
cur2.right = cur1;
cur1 = cur1.left;
continue;
} else {
//如过最右节点已指向cur1,恢复,则使之指向null,
cur2.right = null;
printEdge(cur1.left);
}
}
cur1 = cur1.right;
}
printEdge(head);
System.out.println();
} //打印节点
public void printEdge(Node head) {
Node tail = reverse(head);
Node cur = tail;
while (cur != null) {
System.out.print(cur.value + " ");
cur = cur.right;
}
//恢复链表
reverse(tail);
} //反转节点的右子节点链
public Node reverse(Node head) {
Node pre = null;
Node next = null;
while (head != null) {
next = head.right;
head.right = pre;
pre = head;
head = next;
}
return pre;
} //测试
public static void main(String[] args) {
Chapter3_5 chapter = new Chapter3_5();
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
Node head = NodeUtil.generTree(arr, 0, arr.length - 1);
System.out.print("morris中序遍历:");
chapter.morrisInOrder(head);
System.out.print("非递归中序遍历:");
NodeUtil.inOrder(head);
System.out.println();
System.out.print("morris前序遍历:");
chapter.morrisPreOrder(head);
System.out.print("非递归前序遍历:");
NodeUtil.preOrder(head);
System.out.print("morris后序遍历:");
chapter.morrisPostOrder(head);
System.out.print("非递归后序遍历:");
NodeUtil.postOrder(head);
}
}

《程序员代码面试指南》第三章 二叉树问题 遍历二叉树的神级方法 morris的更多相关文章

  1. 《程序员代码面试指南》第一章 栈和队列 最大值减去最小值小于或等于num的数量

    题目 给定整数数组arr和整数num,共返回多少的数组满足如下情况 max(arr[i...j]) - min(arr[i...j]) <= num max(arr[i...j])表示数组arr ...

  2. 《程序员代码面试指南》第一章 栈和队列 构造数组的MaxTree

    题目 给出一个无重复元素的数组,构造此数组的MaxTree, java代码 /** * @Description: 构造数组的MaxTree * @Author: lizhouwei * @Creat ...

  3. 《程序员代码面试指南》第一章 栈和队列 设计一个有getMin功能的栈

    题目 实现一个特殊的栈,在实现栈的基本功能上,再实现返回栈中最小的元素的操作 要求 1. pop.push.getMin操作时间复杂度都是O(1) 2. 设计的栈类型可以使用现成的栈结构 java代码 ...

  4. 《程序员代码面试指南》第二章 链表问题 将单链表每K个节点之间逆序

    样例 链表1-2-3-4-5-6-7-8-9-10 K=3 ,结果 3-2-1-6-5-4-9-8-7-10 java代码 /** * @Description:将单链表每K个节点之间逆序 * @Au ...

  5. 《程序员代码面试指南》第二章 链表问题 删除中间节点和a/b处节点

    题目 例如 1-2-3-4 删除2,1-2-3-4-5 删除3 例如 a=1,b =2 java代码 /** * @Description:删除中间节点和a/b处节点 * @Author: lizho ...

  6. 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点

    题目 在单链表和双链表中删除倒数第K个节点 java代码 /** * @Description:在单链表和双链表中删除倒数第K个节点 * @Author: lizhouwei * @CreateDat ...

  7. [程序员代码面试指南]第9章-在两个长度相等的排序数组中找到第k小的数(二分)

    题目 给定两个有序数组arr1和arr2,再给定一个整数k,返回所有的数中第k小的数. 题解 利用题目"在两个长度相等的排序数组中找到第上中位数"的函数 分类讨论 k < 1 ...

  8. 程序员代码面试指南 IT名企算法与数据结构题目最优解

    原文链接 这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮 ...

  9. 程序员代码面试指南:IT名企算法与数据结构题目最优解

      第1章栈和队列 1设计一个有getMin功能的栈(士★☆☆☆) 1由两个栈组成的队列(尉★★☆☆) 5如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆) 8猫狗队列(士★☆☆☆)10用一个栈实现另一 ...

随机推荐

  1. TCP/IP协议分析(推荐)

    一;前言 学习过TCP/IP协议的人多有一种感觉,这东西太抽象了,没有什么数据实例,看完不久就忘了.本文将介绍一种直观的学习方法,利用协议分析工具学习TCP/IP,在学习的过程中能直观的看到数据的具体 ...

  2. Android RxJava使用介绍(四) RxJava的操作符

    本篇文章继续介绍下面类型的操作符 Combining Observables(Observable的组合操作符) Error Handling Operators(Observable的错误处理操作符 ...

  3. sql2000实现row_number

    一.以PersonID,classid,dt_ClassData为条件进行分组,每个小组加序号,row_number在sql2005中不可用 方法一.sql2000及以上版本--以PersonID,c ...

  4. HDU-1165-Eddy&#39;s research II

    这个事实上是一个递归题.题目非常easy.m的数非常小.分三种情况.算一下.就能够直接把公式算出来. 当然,也能够用dp做: #include<iostream> #include< ...

  5. cdn日志统一下载程序

    最近实现了网宿cdn,阿里云cdn,腾讯cdn的日志统一格式下载程序,使用简单方便,有需要详见代码: https://github.com/mikeluwen/CdnLogDownload

  6. 运用Arc Hydro提取河网

    Arc hydro 插件需要 spatial analyst 支持: 解决方法:Tools菜单>>Extensions...,勾选Spatial Analyst 1.设置存储路径 ApUt ...

  7. unity3d动态加载资源

    在Unity3D的网络游戏中实现资源动态加载 分类: 最新学习2012-06-14 13:35 1127人阅读 评论(0) 收藏 举报 网络游戏nullvectorjson游戏string 用Unit ...

  8. 51系列xdata、idata、data的用法

    从数据存储类型来说,8051系列有片内.片外程序存储器,片内.片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code.data.xdata.idata以及根据51系列特点而设定的 ...

  9. saltstack之nginx部署

    1./srv/salt/nginx目录树 . conf.sls file |--- nginx |--- nginx-1.5.1.tar.gz |--- nginx.conf |--- nginx_l ...

  10. poj2816

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 29799   Accepted: 12090 De ...