题目

遍历二叉树的神级方法 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. (二)Thymeleaf标准表达式之——简单表达式

    2. 标准表达式(Standard Expression Syntax) 标准表达式包含以下几个方面: 简单表达式: 变量表达式: ${...} 选择变量表达式: *{...} 消息表达式: #{.. ...

  2. centos安装pip Xvfb Selenium

    pip安装命令: python -V wget https://bootstrap.pypa.io/get-pip.py python get-pip.py Xvfb安装命令: yum install ...

  3. Android下Slidingmenu和actionbarsherlock的使用

    1 http://blog.csdn.net/wangjinyu501/article/details/9331749  博客很多,推荐此教程,slidingmenu的demo可以演示 2 http: ...

  4. MySQL_常用SQL语句

    1.按小时统计的语句 select concat(date_format(gmt_create, "%Y-%m-%d %k:00~"), hour(gmt_create)+1, & ...

  5. IOS设置图片背景

    在UIViewController里面这样设置: self.view.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageN ...

  6. linux使用rsync+inotify-tools+ssh实现文件实时同步

    假设某服务器架构中有两台web服务器(IP为192.168.1.252和192.168.1.254),一台代码更新发布服务器(IP为192.168.1.251),需要同步的目录是/data/www/, ...

  7. ios 动画 创建一个UIImageView并将其属性设置animationImages为UIImages 的数组

    NSArray *animationFrames = [NSArray arrayWithObjects: [UIImage imageWithName:@"image1.png" ...

  8. 大组合取模之:1<=n<=m<=1e6,1<=p<=1e9

    /****************************** 大组合取模之:1<=n<=m<=1e6,1<=p<=1e9 使用:程序最开始调用getprime(),需要 ...

  9. Oracle11g完全卸载方法

    一.在oracle11G以前卸载oracle会存在卸载不干净,导致再次安装失败的情况,在运行services.msc打开服务,停止Oracle的所有服务. 二. oracle11G自带一个卸载批处理\ ...

  10. Spring MVC 返回Json IE出现下载

    今天在做一个利用IFrame提交进行form提交表单的时候发现返回的json在ie下竟然弹出了下载的提示, 于是就查看了返回的Content-type:appliation/json;charset= ...