《程序员代码面试指南》第三章 二叉树问题 遍历二叉树的神级方法 morris
题目
遍历二叉树的神级方法 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的更多相关文章
- 《程序员代码面试指南》第一章 栈和队列 最大值减去最小值小于或等于num的数量
题目 给定整数数组arr和整数num,共返回多少的数组满足如下情况 max(arr[i...j]) - min(arr[i...j]) <= num max(arr[i...j])表示数组arr ...
- 《程序员代码面试指南》第一章 栈和队列 构造数组的MaxTree
题目 给出一个无重复元素的数组,构造此数组的MaxTree, java代码 /** * @Description: 构造数组的MaxTree * @Author: lizhouwei * @Creat ...
- 《程序员代码面试指南》第一章 栈和队列 设计一个有getMin功能的栈
题目 实现一个特殊的栈,在实现栈的基本功能上,再实现返回栈中最小的元素的操作 要求 1. pop.push.getMin操作时间复杂度都是O(1) 2. 设计的栈类型可以使用现成的栈结构 java代码 ...
- 《程序员代码面试指南》第二章 链表问题 将单链表每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 ...
- 《程序员代码面试指南》第二章 链表问题 删除中间节点和a/b处节点
题目 例如 1-2-3-4 删除2,1-2-3-4-5 删除3 例如 a=1,b =2 java代码 /** * @Description:删除中间节点和a/b处节点 * @Author: lizho ...
- 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点
题目 在单链表和双链表中删除倒数第K个节点 java代码 /** * @Description:在单链表和双链表中删除倒数第K个节点 * @Author: lizhouwei * @CreateDat ...
- [程序员代码面试指南]第9章-在两个长度相等的排序数组中找到第k小的数(二分)
题目 给定两个有序数组arr1和arr2,再给定一个整数k,返回所有的数中第k小的数. 题解 利用题目"在两个长度相等的排序数组中找到第上中位数"的函数 分类讨论 k < 1 ...
- 程序员代码面试指南 IT名企算法与数据结构题目最优解
原文链接 这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮 ...
- 程序员代码面试指南:IT名企算法与数据结构题目最优解
第1章栈和队列 1设计一个有getMin功能的栈(士★☆☆☆) 1由两个栈组成的队列(尉★★☆☆) 5如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆) 8猫狗队列(士★☆☆☆)10用一个栈实现另一 ...
随机推荐
- .net用url重写URLReWriter实现任意二级域名
.net用url重写URLReWriter实现任意二级域名 这两天需要用到URLReWriter来搞那个猪头的Blog,网上看到篇好文,收藏 摘要:解释了url重写的相关知识.用asp.net实现二级 ...
- nightwatchjs --Expect element to not include text
to have NightWatch to find text in a div. browser.assert.containsText('#output', 'find me') But how ...
- VM虚拟机内ubuntu无法连接到网络
VM虚拟机内ubuntu无法连接到网络 解决:编辑网络,将网路都删除掉.又一次加入网络桥接和NAT链接. .又一次连接就可以,查看一下ip地址. 方法2: 虚拟机中新装ubuntu 编辑虚拟网络,先恢 ...
- 第一篇: Ansible 介绍
应用场景: BOSS:运维帮忙把所有的服务器tomcat 重启一下,谢谢!(tomcat 服务有2K台) 运维:………… 运维: 啪啪啪啪啪啪啪啪..........(键盘的声音响彻办公室) B ...
- 使用Office 365前,企业必须要知道的10件事
目前的市场上充斥着很多关于微软Office 365的炒作,相信厂商.客户或者企业的都有自己不同的考虑.Office 365是微软云版本的Office,用户可以通过互联网创建一个帐户,付款.下载应用安装 ...
- 嵌入式开发之工具---比开发手册更重要的一个命令 man page
man http://bbs.chinaunix.net/thread-826490-1-1.html http://read.pudn.com/downloads70/ebook/254107/ch ...
- cocos2d-x 2.x 支持多个方向屏幕翻转
主要改动 RootViewController.mm 的 supportedInterfaceOrientations 方法 1.四个方向 UIInterfaceOrientationMaskAll ...
- saltstack内置执行模块useradd
useradd模块用于命令行管理用户 salt.modules.useradd.add(name, uid=None, gid=None, groups=None, home=None, shell= ...
- 也谈在 .NET 平台上使用 Scala 语言(续)
而我是在 Ubuntu 操作系统中使用 Scala.NET 的,应该没有这个问题. 那么,就让我们来測试一下吧. 如今,我们添加一个 DotNet.cs 文件,例如以下所看到的: 1 2 3 4 5 ...
- vptr
#include <stdio.h> class Point3d { public: virtual ~Point3d(){} public: static Point3d origin; ...