Morris遍历
原创
©著作权归作者所有:来自51CTO博客作者放下也不自在的原创作品,请联系作者获取转载授权,否则将追究法律责任
* Morris遍历:可以将非递归遍历中的空间复杂度降为O(1)。从而实现时间复杂度为O(N),而空间复杂度为O(1)的精妙算法
* 如果cur无左孩子,cur向右移动(cur=cur.right)
* 如果cur有左孩子,找到cur左子树上最右的节点,记为mostright
* 如果mostright的right指针指向空,让其指向cur,cur向左移动(cur=cur.left)
* 如果mostright的right指针指向cur,让其指向空,cur向右移动(cur=cur.right)
* 实质:建立一种机制,对于没有左子树的节点只到达一次,对于有左子树的节点会到达两次
public static void morris(Node head) {
System.out.println(cur.value);
if (mostRight != null) { // 左子树不为空
while (mostRight.right != null && mostRight.right != cur) {
mostRight = mostRight.right;
if (mostRight.right == null) { // 第一次访问该节点
public static void morrisIn(Node head) {
while (mostRight.right != null && mostRight.right != cur) {
mostRight = mostRight.right;
if (mostRight.right == null) {
System.out.println(cur.value);
public static void morrisPre(Node head) {
while (mostRight.right != null && mostRight.right != cur) {
mostRight = mostRight.right;
if (mostRight.right == null) {
System.out.println(cur.value);
System.out.println(cur.value);
public static void main(String[] args) {
node.right = new Node(3);
node.left.left = new Node(4);
node.left.right = new Node(5);
node.right.left = new Node(6);
node.right.right = new Node(7);
System.out.println("=================");
System.out.println("=================");
public static class Node {