代码
tree_traversal.py
from typing import Optional
import time
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Traversal:
# 中序遍历
def inorder_traversal(self, root: Optional[TreeNode])-> list:
stack = []
val_list = []
while root or stack:
while root:
stack.append(root)
root = root.left
if stack:
node = stack.pop()
root = node.right
val_list.append(node.val)
return val_list
# 前序遍历
def preorder_traversal(self, root: Optional[TreeNode])-> list:
stack = []
val_list = []
while root or stack:
while root:
stack.append(root)
val_list.append(root.val)
root = root.left
if stack:
node = stack.pop()
root = node.right
return val_list
# 正常后序遍历
def normal_postorder_traversal(self, root: Optional[TreeNode])-> list:
stack = []
val_list = []
stack.append(root)
visited = None
while stack or root:
while root and root.left:
stack.append(root.left)
root = root.left
if stack:
root = stack[-1]
if root.right and root.right != visited:
root = root.right
stack.append(root)
else:
val_list.append(root.val)
stack.pop()
visited = root
root = None
return val_list
# 逆序后序遍历(左、右、中)。思路中、右、左后逆序
def postorder_traversal(self, root: Optional[TreeNode])-> list:
stack = []
val_list = []
while stack or root:
while root:
val_list.append(root.val)
stack.append(root)
root = root.right
if stack:
node = stack.pop()
root = node.left
return val_list[::-1]
if __name__ == "__main__":
root = TreeNode(1)
root.left=TreeNode(2)
root.left.left = TreeNode(4)
root.right = TreeNode(3)
root.right.left =TreeNode(5)
root.right.right =TreeNode(6)
# 1
# / \
# 2 3
# / / \
# 4 5 6
tr = Traversal()
print(" 前序遍历:%s" % tr.inorder_traversal(root))
print(" 中序遍历:%s" % tr.preorder_traversal(root))
print("正常后序遍历:%s" % tr.normal_postorder_traversal(root))
print("逆序后序遍历:%s" % tr.postorder_traversal(root))
运行结果
python tree_traversal.py
前序遍历: [4, 2, 1, 5, 3, 6]
中序遍历: [1, 2, 4, 3, 5, 6]
正常后序遍历: [4, 2, 5, 6, 3, 1]
逆序后序遍历: [4, 2, 5, 6, 3, 1]