正文
当树的深度较大时,递归可能会导致栈溢出。此时,我们可以使用显式栈来模拟递归过程,实现二叉树的深度优先搜索(DFS)。
1. 先序遍历 (根 -> 左 -> 右)
最简单的迭代写法,利用栈“后进先出”的特性,先压右孩子再压左孩子。
1 | fun preorderTraversal(root: TreeNode?) { |
2. 中序遍历 (左 -> 根 -> 右)
中序遍历的逻辑是:一直往左走到底,然后回溯处理根节点,最后处理右子树。
1 | fun inorderTraversal(root: TreeNode?) { |
3. 后序遍历 (左 -> 右 -> 根)
后序遍历是迭代写法中最难的一种,关键在于判断右子树是否已经访问过。
1 | fun postorderTraversal(root: TreeNode?) { |
使用说明
核心技巧:
- 先序:根节点先处理,利用栈保存待处理的左右子节点。
- 中序:利用栈实现“回溯”功能,记住来时的路。
- 后序:需要一个额外的
lastVisited指针来标记右子树的状态,防止陷入死循环。
性能优势:
- 避免了递归调用的开销。
- 空间复杂度为 $O(H)$,在极端不平衡的树下比递归更安全。
注意点:
- 在 Kotlin 中,建议使用
ArrayDeque代替Stack或LinkedList,性能更佳且语义更清晰。 - 注意空指针的处理和循环终止条件。
- 在 Kotlin 中,建议使用