def MorrisTraversal(root):
pre = None
if root is None:
return
curr = root
while curr is not None:
if curr.left is None:
print curr.val
curr = curr.right
else:
pre = curr.left
while pre.right is not None and pre.right != curr:
pre = pre.right
if pre.right is None:
pre.right = curr
curr = curr.left
elif pre.right == curr:
pre.right = None
print curr.val
curr = curr.right
莫里斯遍历的大意:先定义一个当前节点,并将其指向根节点。然后定义一个所谓“前节点”,先不赋值。
1.如果当前节点没有左子树:
- a.打印它的值(访问它)
- b.将其移动到它的右子节点。
2.否则:
- a.将前节点指向到当前节点(根节点)的左子节点。
- b.前节点从这里开始,一直往右节点走,直到走到最右边的子节点。
- c.将前节点的右子节点(本来为空)指向当前节点。
Morris Traversal的时间复杂度是O(N),空间复杂度是常数。