在二叉树遍历问题中,有三种常见的遍历方式:前序遍历、中序遍历和后序遍历。以下是这三种遍历方式的递归模板:
1. 前序遍历(Preorder Traversal):
def preorderTraversal(root):
if not root:
return []
result = []
result.append(root.val) # 处理当前节点
result.extend(preorderTraversal(root.left)) # 递归处理左子树
result.extend(preorderTraversal(root.right)) # 递归处理右子树
return result
2. 中序遍历(Inorder Traversal):
def inorderTraversal(root):
if not root:
return []
result = []
result.extend(inorderTraversal(root.left)) # 递归处理左子树
result.append(root.val) # 处理当前节点
result.extend(inorderTraversal(root.right)) # 递归处理右子树
return result
3. 后序遍历(Postorder Traversal):
def postorderTraversal(root):
if not root:
return []
result = []
result.extend(postorderTraversal(root.left)) # 递归处理左子树
result.extend(postorderTraversal(root.right)) # 递归处理右子树
result.append(root.val) # 处理当前节点
return result
这些模板基于递归思想,对二叉树进行深度优先遍历。对于每个节点,都会首先处理当前节点,然后递归处理左子树和右子树。这样可以保证在遍历过程中按照前序、中序或后序的顺序访问节点。
在实际应用中,也可以使用迭代的方法,例如使用栈来模拟递归的过程,实现非递归的遍历。
迭代法模板
以下是使用迭代法进行二叉树遍历的模板。这里使用栈来模拟递归的过程,实现非递归的遍历。
1. 前序遍历(Preorder Traversal):
def preorderTraversal(root):
if not root:
return []
result = []
stack = [root]
while stack:
node = stack.pop()
result.append(node.val) # 处理当前节点
if node.right:
stack.append(node.right) # 先加入右子树,因为栈是先入后出
if node.left:
stack.append(node.left) # 再加入左子树
return result
2. 中序遍历(Inorder Traversal):
def inorderTraversal(root):
if not root:
return []
result = []
stack = []
while stack or root:
while root:
stack.append(root)
root = root.left # 先一直往左走到底,模拟递归的过程
node = stack.pop()
result.append(node.val) # 处理当前节点
root = node.right # 处理右子树,如果右子树为空,下一次循环会继续处理栈中的节点
return result
3. 后序遍历(Postorder Traversal):
def postorderTraversal(root):
if not root:
return []
result = []
stack = [root]
while stack:
node = stack.pop()
result.insert(0, node.val) # 插入到结果列表的开头,模拟逆序
if node.left:
stack.append(node.left)
if node.right:
stack.append(node.right)
return result
这些迭代法的模板使用栈来辅助遍历,通过不断地迭代,模拟了递归的过程。这样可以在不使用递归的情况下实现二叉树的前序、中序和后序遍历。
其他优秀模板链接:https://leetcode.cn/problems/binary-tree-preorder-traversal/solutions/642769/python3-die-dai-bian-li-chang-gui-jie-fa-1egc/
https://leetcode.cn/problems/binary-tree-preorder-traversal/solutions/247053/tu-jie-er-cha-shu-de-si-chong-bian-li-by-z1m/