题目:
给定一颗二叉树的头节点head,完成二叉树的先序、中序和后序遍历,如果二叉树的节点为N,则要求时间复杂度为O(N),额外空间复杂度为O(1)
Morris遍历
代码如下:
def getMorris(Node head):
if head == None:
return
cur = head
mostRight = None
while cur!=None:
mostRight = cur.left
if mostRight!=None:
while mostRight!=None and mostRight.right!=cur:
mostRight = mostRight.right
if mostRight.right == None:
mostRight.right = cur
cur = cur.left
continue
else:
mostRight.right = None
cur = cur.right
# morries 前序遍历
def morriesPre(Node head):
if head == None:
return
cur = head
mostRight = None
while cur!=None:
mostRight = cur.left
if mostRight!=None:
while mostRight!=None and mostRight.right!=cur:
mostRight = mostRight.right
if mostRight==None:
mostRight.right = cur
print(cur.value)
cur = cur.left
continue
else:
mostRight == None
else:
print(cur.value)
cur = cur.right
# morries 中序遍历
def morriesIn(Node head):
if head == None:
return
cur = head
mostRight = None
while cur!=None:
mostRight = cur.left
if mostRight!=None:
while mostRight!=None and mostRight.right!=cur:
mostRight = mostRight.right
if mostRight==None:
mostRight.right = cur
print(cur.value)
cur = cur.left
continue
else:
mostRight == None
print(cur.value)
cur = cur.right
# morries 后序
def morrieslast(Node head):
if head == None:
return
cur = head
mostRight = None
while cur!=None:
mostRight = cur.left
if mostRight != None:
while mostRight!=None and mostRight.right!=cur:
mostRight = mostRight.right
if mostRight == None:
mostRight.left = cur
cur = cur.left
continue
else:
mostRight.right = None
printEdge(cur.left)
printEdfe(head)
cur = cur.right
def printEdge(Node head):
tail = reverseEdge(head)
cur = tail
while cur!=None:
print(cur.value)
cur = cur.right
reverseEdge(tail)
def reverseEdge(Node from_):
pre = None
next_ = None
while from_!=None:
next_ = from_.right
from_.right = pre
pre = from_
from_ = next_
return pre