Morris算法的时间复杂度是O(n),空间复杂度为O(1)
基本思想是:
1. 找到当前节点的前驱节点,即左节点的最右节点,若为空则指向当前节点,若为当前节点则表明该节点左边以及该节点已经遍历完,并将前驱节点的有指针恢复为空
2. 若当前节点的左节点为空,则直接访问当前节点右节点
前序遍历和中序遍历代码差不多,只是visit位置不同
public void morris_preorder(TreeNode root) {
TreeNode node1 = root, node2 = null;
while (node1 != null) {
node2 = node1.left;
if (node2 != null) {
while (node2.right != null && node2.right != node1) node2 = node2.right;
if (node2.right == null) {
visit(node1);
node2.right = node1;
node1 = node1.left;
continue;
} else
node2.right = null;
} else
visit(node1);
node1 = node1.right;
}
}
public void morris_inorder(TreeNode root) {
TreeNode node1 = root, node2 = null;
while (node1 != null) {
node2 = node1.left;
if (node2 != null) {
while (node2.right != null && node2.right != node1) node2 = node2.right;
if (node2.right == null) {
node2.right = node1;
node1 = node1.left;
continue;
} else
node2.right = null;
}
visit(node1);
node1 = node1.right;
}
}