📜  无递归无栈的中序树遍历!(1)

📅  最后修改于: 2023-12-03 14:55:08.615000             🧑  作者: Mango

无递归无栈的中序树遍历

中序遍历是二叉树经典的遍历方式之一,一般使用递归或者栈来实现。但是递归有栈溢出的风险,而使用栈的方法又增加了额外的空间复杂度。本文介绍一种无递归无栈的中序遍历算法。

思路

使用一个指针 curr 来指向当前的节点,开始时指向根节点。在中序遍历中,先遍历左子树,再遍历当前节点,最后遍历右子树。所以我们先需要在循环中将 curr 指向左子树的最底层节点,然后记录该节点的父节点,遍历当前节点,再将 curr 指向右子树的最底层节点。

我们假设当前节点为 curr,则具体步骤如下:

  1. 如果 curr 不为空,则将其压入栈中并将 curr 指向左子树。
  2. 如果 curr 为空,则从栈中弹出节点并将 curr 指向该节点的右子树。
  3. 如果 curr 和栈都为空,则遍历结束。
代码实现

以下为Python实现代码:

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        res = []
        curr = root
        while curr or stack:
            while curr:
                stack.append(curr)
                curr = curr.left
            curr = stack.pop()
            res.append(curr.val)
            curr = curr.right
        return res
总结

本文介绍了一种无递归无栈的中序遍历算法,避免了递归的栈溢出风险和栈的空间复杂度。该算法时间复杂度为 $O(n)$,空间复杂度为 $O(1)$。