Morris遍历
描述![请添加图片描述](https://img-blog.csdnimg.cn/66eb684b9d314b33bfe15f261e70f81c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASGVhdmVuX20=,size_20,color_FFFFFF,t_70,g_se,x_16)
分析
![请添加图片描述](https://img-blog.csdnimg.cn/cacdad57436f4873a13d7fb73b278694.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASGVhdmVuX20=,size_20,color_FFFFFF,t_70,g_se,x_16)
Code
public static void morris(Node head) {
if (head == null) {
return;
}
Node cur = head;
Node mostRight = null;
while (cur != null) {
mostRight = cur.left;
if (mostRight != null) {
while (mostRight.right != null && mostRight.right != cur) {
mostRight = mostRight.right;
}
if (mostRight.right == null) {
mostRight.right = cur;
cur = cur.left;
continue;
} else {
mostRight.right = null;
}
}
cur = cur.right;
}
}
先序Morris
![请添加图片描述](https://img-blog.csdnimg.cn/b27b7be23b594c0a8b10175acfd8e3e3.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASGVhdmVuX20=,size_20,color_FFFFFF,t_70,g_se,x_16)
Code
public static void morrisPre(Node head) {
if (head == null) {
return;
}
Node cur1 = head;
Node mostRight = null;
while (cur1 != null) {
mostRight = cur1.left;
if (mostRight != null) {
while (mostRight.right != null && mostRight.right != cur1) {
mostRight = mostRight.right;
}
if (mostRight.right == null) {
mostRight.right = cur1;
System.out.print(cur1.value + " ");
cur1 = cur1.left;
continue;
} else {
mostRight.right = null;
}
} else {
System.out.print(cur1.value + " ");
}
cur1 = cur1.right;
}
System.out.println();
}
中序Morris
![请添加图片描述](https://img-blog.csdnimg.cn/ec792eb58a204ecc8fcda8730e14770f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASGVhdmVuX20=,size_20,color_FFFFFF,t_70,g_se,x_16)
Code
public static void morrisIn(Node head) {
if (head == null) {
return;
}
Node cur1 = head;
Node mostRight = null;
while (cur1 != null) {
mostRight = cur1.left;
if (mostRight != null) {
while (mostRight.right != null && mostRight.right != cur1) {
mostRight = mostRight.right;
}
if (mostRight.right == null) {
mostRight.right = cur1;
cur1 = cur1.left;
continue;
} else {
mostRight.right = null;
}
}
System.out.print(cur1.value + " ");
cur1 = cur1.right;
}
System.out.println();
}
后序Morris
![请添加图片描述](https://img-blog.csdnimg.cn/0282794fa09843eda78cd2281f846aca.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASGVhdmVuX20=,size_20,color_FFFFFF,t_70,g_se,x_16)
Code
public static void morrisPos(Node head) {
if (head == null) {
return;
}
Node cur1 = head;
Node mostRight = null;
while (cur1 != null) {
mostRight = cur1.left;
if (mostRight != null) {
while (mostRight.right != null && mostRight.right != cur1) {
mostRight = mostRight.right;
}
if (mostRight.right == null) {
mostRight.right = cur1;
cur1 = cur1.left;
continue;
} else {
mostRight.right = null;
printEdge(cur1.left);
}
}
cur1 = cur1.right;
}
printEdge(head);
System.out.println();
}
public static void printEdge(Node head) {
Node tail = reverseEdge(head);
Node cur = tail;
while (cur != null) {
System.out.print(cur.value + " ");
cur = cur.right;
}
reverseEdge(tail);
}
public static Node reverseEdge(Node from) {
Node pre = null;
Node next = null;
while (from != null) {
next = from.right;
from.right = pre;
pre = from;
from = next;
}
return pre;
}