python二叉树的深度优先遍历和广度优先遍历
一、代码实现
from collections import dequeclass TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef dfs_preorder(root):"""前序遍历 (根-左-右)"""if not root:return []return [root.val] + dfs_preorder(root.left) + dfs_preorder(root.right)def dfs_inorder(root):"""中序遍历 (左-根-右)"""if not root:return []return dfs_inorder(root.left) + [root.val] + dfs_inorder(root.right)def dfs_postorder(root):"""后序遍历 (左-右-根)"""if not root:return []return dfs_postorder(root.left) + dfs_postorder(root.right) + [root.val]def bfs(root):"""广度优先遍历 (层级遍历)"""if not root:return []queue = deque([root])result = []while queue:# 使用高性能队列deque,popleft操作时间复杂度为O(1),而列表的pop(0)方法操作时间复杂度O(n)node = queue.popleft()result.append(node.val)if node.left:queue.append(node.left)if node.right:queue.append(node.right)return resultif __name__ == "__main__":# 构建示例二叉树# 1# / \# 2 3# / \# 4 5root = TreeNode(1)root.left = TreeNode(2)root.right = TreeNode(3)root.left.left = TreeNode(4)root.left.right = TreeNode(5)print("DFS 前序遍历:", dfs_preorder(root))print("DFS 中序遍历:", dfs_inorder(root))print("DFS 后序遍历:", dfs_postorder(root))print("BFS 层级遍历:", bfs(root))
二、dfs递归过程分析
dfs前序遍历结果为: [1, 2, 4, 5, 3]
分析过程如下:
1. 访问根节点1 → 结果: [1]
2. 递归左子树(2):
- 访问节点2 → 结果:
[1, 2]
- 递归左子树(4):
- 访问节点4 → 结果:
[1, 2, 4]
(无子节点,返回)
- 访问节点4 → 结果:
- 递归右子树(5):
- 访问节点5 → 结果:
[1, 2, 4, 5]
(无子节点,返回)
- 访问节点5 → 结果:
3. 递归右子树(3):
- 访问节点3 → 结果:
[1, 2, 4, 5, 3]
(无子节点,返回)