二叉树的前中后序遍历非递归写法

前言

数据结构学过好久了,刷leetcode做到二叉树的题,干脆系统的复习一下二叉树的相关知识。二叉树的遍历是基本操作,其中非递归写法稍微难一些。其相对递归地有点是效率高,空间时间均更高效,特别是二叉树比较深的情况下。

前序遍历

前序遍历就是从栈里取出节点,然后右子节点入栈,左子节点入栈,结束的条件是栈中没有节点。

中序遍历

算法中对每一个节点先一直左子树的子树这样进栈,结束后取出当前节点,右子树进栈。这样循环。

class Traversal:
    def midtraversal(self, root):
        stack = []
        current = root
        while stack or current: #我认为这个判断条件很重要
            if current:
                stack.append(current)
                current = current.left
            else:
                current = stack.pop()
                print(current.val)
                current = current.right

后序遍历

本段代码是看的网上的,我觉得挺好。使用了两个stack,其思想是后序遍历是左右根,栈具有后进先出,先进后出的特点,那么第一个stack栈进栈的顺序是中(进后立即出)左右,出栈顺序是中右左,用第二个stack2栈存储stack出栈的节点,那么stack2进栈的顺序就是中右左,则stack2出栈的顺序是左右中。

class Traversal:
    def backtraversal(self, node):
        stack = [node]
        stack2 = []
        while len(stack) > 0:
            node = stack.pop()
            stack2.append(node)
            if node.left is not None:
                stack.append(node.left)
            if node.right is not None:
                stack.append(node.right)
        while len(stack2) > 0:
            print(stack2.pop().val)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值