# 中序遍历-迭代-LC94_二叉树的中序遍历
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return []
stack = [] # 不能提前将root节点加入stack中
result = []
cur = root
while cur or stack:
# 先迭代访问最底层的左子树节点
if cur:
stack.append(cur)
cur = cur.left
# 到达最左节点后处理栈顶节点
else:
cur = stack.pop()
result.append(cur.val)
# 取栈顶元素右节点
cur = cur.right
return result
算法步骤
- 初始化空栈和空结果列表
- 从根节点开始,将其所有左子节点依次压入栈
- 当没有左子节点时,弹出栈顶节点并访问它
- 然后转向该节点的右子节点
- 重复上述过程直到当前节点为空且栈为空
示例演示
考虑以下二叉树:
中序遍历的正确结果是:[4, 2, 5, 1, 3]
让我们一步步跟踪代码执行:
-
初始状态:
- stack = []
- result = []
- cur = 1
-
循环开始:
- cur=1不为空,压入栈,移动到左子节点2 stack = [1] cur = 2
- cur=2不为空,压入栈,移动到左子节点4 stack = [1, 2] cur = 4
- cur=4不为空,压入栈,移动到左子节点(null) stack = [1, 2, 4] cur = None
- cur=None,弹出栈顶4,访问4,移动到右子节点(null) stack = [1, 2] result = [4] cur = None
- cur=None,弹出栈顶2,访问2,移动到右子节点5 stack = [1] result = [4, 2] cur = 5
- cur=5不为空,压入栈,移动到左子节点(null) stack = [1, 5] cur = None
- cur=None,弹出栈顶5,访问5,移动到右子节点(null) stack = [1] result = [4, 2, 5] cur = None
- cur=None,弹出栈顶1,访问1,移动到右子节点3 stack = [] result = [4, 2, 5, 1] cur = 3
- cur=3不为空,压入栈,移动到左子节点(null) stack = [3] cur = None
- cur=None,弹出栈顶3,访问3,移动到右子节点(null) stack = [] result = [4, 2, 5, 1, 3] cur = None
- cur=None且stack为空,循环结束
最终结果为:[4, 2, 5, 1, 3],与预期一致。