class node:
def __init__(self, l, r, v):
self.left = l
self.right = r
self.val = v
node_7 = node(None, None, 7)
node_6 = node(None, None, 6)
node_5 = node(None, None, 5)
node_4 = node(None, None, 4)
node_3 = node(node_7, None, 3)
node_2 = node(node_5, node_6, 2)
node_1 = node(node_3, node_4, 1)
root = node(node_1, node_2, 'root')
# 在构建中序线索树的同时,遍历整个数,并且边构建线索,边删除线索,不影响树的结构
def morris(node):
if not node:
return
while node:
precursor = node.left
if precursor:
while precursor.right and precursor.right != node: # 经历这个循环之后,precursor就是node的中序遍历的 前驱节点
precursor = precursor.right
if precursor.right == None: # 建立一个中遍历中 node的上一个节点指向node的线索,第一次为4 指向 root
precursor.right = node
print(node.val, '->', end='')
node = node.left
continue
else:
precursor.right = None
else:
print(node.val, '->', end='')
node = node.right
# morris(root)
'''------------------------------------------以下是后序遍历--------------------------------------------------------------'''
def revers(node):
if not node or not node.right:
return node
new_node = revers(node.right)
node.right.right = node
node.right = None
return new_node
def print_node(node):
tail = revers(node) # 反转链表
while tail:
print(tail.val)
tail = tail.right
revers(tail) # 反转回来保留树的原本结构
# 2 morris 遍历后续 ,建立和销毁线索的过程是一样的,区别在于打印
def morris_low(node):
if not node:
return
root = node
while node:
precursor = node.left
if precursor:
while precursor.right and precursor.right != node: # 经历这个循环之后,precursor就是node的中序遍历的 前驱节点
precursor = precursor.right
if precursor.right == None: # 建立一个中遍历中 node的上一个节点指向node的线索,第一次为4 指向 root
precursor.right = node
node = node.left
continue
else:
# 如果前驱节点指向自己,那么翻转前驱节点的链表打印
precursor.right = None
print_node(node.left)
node = node.right
print_node(root)
morris_low(root)
二叉树的morris遍历
最新推荐文章于 2024-06-17 17:35:06 发布