📅  最后修改于: 2023-12-03 14:55:08.615000             🧑  作者: Mango
中序遍历是二叉树经典的遍历方式之一,一般使用递归或者栈来实现。但是递归有栈溢出的风险,而使用栈的方法又增加了额外的空间复杂度。本文介绍一种无递归无栈的中序遍历算法。
使用一个指针 curr
来指向当前的节点,开始时指向根节点。在中序遍历中,先遍历左子树,再遍历当前节点,最后遍历右子树。所以我们先需要在循环中将 curr
指向左子树的最底层节点,然后记录该节点的父节点,遍历当前节点,再将 curr
指向右子树的最底层节点。
我们假设当前节点为 curr
,则具体步骤如下:
curr
不为空,则将其压入栈中并将 curr
指向左子树。curr
为空,则从栈中弹出节点并将 curr
指向该节点的右子树。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)$。