二叉树的Morris遍历
之前总结过二叉树的经典遍历算法,包括递归和常规非递归算法,其时间复杂度和空间复杂度均为O(n)。Morris算法巧妙地利用了二叉树的线索化思路,把叶节点的空指针利用起来,将二叉树的遍历算法的空间复杂度降低为O(1),时间复杂度仍然为O(n)。
主要思路:找到每个节点的左子树的最右节点,让它指向本节点。在遍历之后恢复节点的空指针。
文章目录
前序遍历
public static void MorrisPre(Node head) {
if (head == null) {
return;
}
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;
}
if (cur2.right == null) {
cur2.right = cur1;
System.out.print(cur1.value + " "); //打印时机
cur1 = cur1.left;
continue;
} else {
cur2.right = null;
}
} else {
System.out.print(cur1