94 二叉树的中序遍历(迭代法)

# 中序遍历-迭代-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

算法步骤

  1. 初始化空栈和空结果列表
  2. 从根节点开始,将其所有左子节点依次压入栈
  3. 当没有左子节点时,弹出栈顶节点并访问它
  4. 然后转向该节点的右子节点
  5. 重复上述过程直到当前节点为空且栈为空

示例演示

考虑以下二叉树:


中序遍历的正确结果是:[4, 2, 5, 1, 3]

让我们一步步跟踪代码执行:

  1. 初始状态:

    • stack = []
    • result = []
    • cur = 1
  2. 循环开始:

    • 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],与预期一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值