📚 目录
1. 前序遍历简介
前序遍历(Preorder Traversal)是二叉树遍历的一种方式,遍历顺序为: 根节点 -> 左子树 -> 右子树
示例: 对于二叉树:
1
/ \ 2 3 / \ 4 5
前序遍历结果为:`1 -> 2 -> 4 -> 5 -> 3` <a name="2"></a> ## 2. 递归遍历 <a name="21"></a> ### 2.1 实现方式 ```python def preorder_traversal(root): if root is None: return print(root.val) # 访问根节点 preorder_traversal(root.left) # 递归遍历左子树 preorder_traversal(root.right) # 递归遍历右子树
2.2 优点与缺点
优点:
-
🧠 代码简洁:逻辑清晰,易于理解和实现
-
⏳ 开发效率高:适合快速实现和调试
缺点:
-
🚫 栈溢出风险:递归深度过大时可能导致栈溢出
-
⚡ 性能开销:函数调用栈的开销较大
3. 非递归遍历
3.1 实现方式
使用栈模拟递归过程:
def preorder_traversal_iterative(root): if root is None: return stack = [root] while stack: node = stack.pop() print(node.val) # 访问根节点 if node.right: # 右子树先入栈 stack.append(node.right) if node.left: # 左子树后入栈 stack.append(node.left)
3.2 优点与缺点
优点:
-
🚀 性能更优:避免了函数调用栈的开销
-
🔒 无栈溢出风险:适合处理深度较大的二叉树
缺点:
-
🧩 代码复杂:需要手动维护栈,逻辑相对复杂
-
⏳ 开发效率低:实现和调试时间较长
4. 递归与非递归的对比
| 特性 | 递归遍历 | 非递归遍历 |
|---|---|---|
| 代码复杂度 | 简单 | 复杂 |
| 性能 | 较低(函数调用开销) | 较高(无函数调用开销) |
| 栈溢出风险 | 有(递归深度过大时) | 无 |
| 适用场景 | 小规模数据、快速实现 | 大规模数据、性能要求高的场景 |
5. 实际应用场景
-
递归遍历:
-
小规模数据处理
-
快速原型开发
-
教学和演示
-
-
非递归遍历:
-
大规模数据处理(如文件系统遍历)
-
性能敏感的场景(如实时系统)
-
深度较大的二叉树遍历
-
6. 面试常见问题
-
递归遍历和非递归遍历的区别?
-
递归遍历代码简洁但性能较差,非递归遍历性能更优但代码复杂。
-
-
如何选择递归还是非递归?
-
根据数据规模和性能要求选择,小规模数据用递归,大规模数据用非递归。
-
-
非递归遍历的实现原理是什么?
-
使用栈模拟递归过程,手动维护节点访问顺序。
-
-
递归遍历的栈溢出问题如何解决?
-
改用非递归遍历,或优化递归深度(如尾递归优化)。
-
207

被折叠的 条评论
为什么被折叠?



