二叉树前序、中序、后序深度遍历 (迭代法)

遍历顺序可以看作访问中间节点的顺序

  • 前序遍历:中间节点 --> 左子树 --> 右子树
  • 中序遍历:左子树 --> 中间节点 --> 右子树
  • 后序遍历:左子树 --> 右子树 --> 中间节点

二叉树前序遍历Leetcode 144

利用栈后进先出,先将左孩子入栈,再将右孩子入栈,最后入栈中间节点,当节点为空时,依次出栈

def preorderTraversal(self, root: TreeNode) -> List[int]:
    if not root:
        return []
    stack = [(root, 0)]
    ret = []

    while stack:
        cur, flag = stack.pop()
        if flag == 0:   # flag=0: 未被访问过
            if cur.right:
                stack.append((cur.right, 0))
            if cur.left:
                stack.append((cur.left, 0))
            stack.append((cur, 1))
        else:
            ret.append(cur.val)
    return ret

# 因为先弹出中间节点,可以简化为以下代码
def preorderTraversal(self, root: TreeNode) -> List[int]:
    if not root:
        return []

    stack = [root]
    res = []
    while stack:
        cur = stack.pop()
        res.append(cur.val)
        if cur.right:
            stack.append(cur.right)
        if cur.left:
            stack.append(cur.left)
    
    return res

二叉树中序遍历Leetcode 94
思路同上,只需将压入栈的顺序改为右中左

def inorderTraversal(self, root: TreeNode) -> List[int]:
    if not root:
        return []
    stack, res = [(root, 0)], []

    while stack:
        cur, flag = stack.pop()
        if flag == 0:
            if cur.right:
                stack.append((cur.right, 0))
            stack.append((cur, 1))
            if cur.left:
                stack.append((cur.left, 0))
        else:
            res.append(cur.val)

    return res
    

二叉树后序遍历Leetcode 145
思路同上,只需将压入栈的顺序改为中右左

def postorderTraversal(self, root: TreeNode) -> List[int]:
    if not root:
        return []
    stack = [(root, 0)]
    ret = []

    while stack:
        cur, flag = stack.pop()
        if flag == 0:   # flag=0: 未被访问过
            stack.append((cur, 1))
            if cur.right:
                stack.append((cur.right, 0))
            if cur.left:
                stack.append((cur.left, 0))
        else:
            ret.append(cur.val)
    return ret

So easy !

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值