灵感来源
- 保持更新,努力学习
- python脚本学习
二叉树的前序遍历
解题思路
前序遍历是一种深度优先搜索(DFS)策略,访问顺序为:根节点 → 左子树 → 右子树。以下是两种常见的实现方法:
-
递归法(简单直接,时间复杂度 O (n),空间复杂度 O (h),h 为树的高度)
- 访问根节点
- 递归遍历左子树
- 递归遍历右子树
-
迭代法(使用栈模拟递归过程,避免栈溢出风险)
- 将根节点压入栈
- 循环弹出栈顶节点并访问
- 先压入右子节点(后访问),再压入左子节点(先访问)
class Solution: def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]: res = [] def dfs(node): if not node: return res.append(node.val) # 先访问根节点 dfs(node.left) # 递归左子树 dfs(node.right) # 递归右子树 dfs(root) return res
逐行解释
递归解法
class Solution:
def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
# 初始化结果列表
res = []
# 定义深度优先搜索辅助函数
def dfs(node):
# 递归终止条件:节点为空
if not node:
return
# 前序遍历:先访问根节点
res.append(node.val)
# 递归遍历左子树
dfs(node.left)
# 递归遍历右子树
dfs(node.right)
# 从根节点开始递归
dfs(root)
return res
迭代解法
class Solution:
def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
# 处理空树情况
if not root:
return []
# 初始化结果列表和栈
res = []
stack = [root] # 根节点先入栈
while stack:
# 弹出栈顶节点并访问
node = stack.pop()
res.append(node.val)
# 注意栈的特性:后进先出
# 先压入右子节点,这样左子节点会先被处理
if node.right:
stack.append(node.right)
# 后压入左子节点
if node.left:
stack.append(node.left)
return res