二叉树的前序、中序、后序遍历非递归版本

167 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

我们在上一篇实现了递归版本的二叉树遍历,点击这里去看递归版本,今天我们来讲解一下非递归版本的实现。 我们首先回忆一下题目要求。

问题描述

给定一个二叉树,分别按照二叉树的先序、中序和后序打印所有节点。

要求:空间复杂度是O(n),时间复杂度是O(n)。

示例:

输入: [1,null,2,3]  
   1
    \
     2
    /
   3 

输出: [[1,2,3],[1,3,2],[3,2,1]]

非递归实现

下面我们来看一下代码如何实现。

from pyarabic.stack import Stack
def inorder(root):
    res=[]
    stack=Stack()
    while root or stack:
        while root:
            stack.push(root)
            root=root.left

        root=stack.pop()
        res.append(root.val)
        root=root.right

    return res

同理,先序遍历和后序遍历也可以使用非递归的方式实现。

下面,我们采用非递归的方式来实现本题的需求。

class Solution:

    def threeOrders(self, root):
        result = []
        result.append(self.preorder(root))
        result.append(self.inorder(root))
        result.append(self.postorder(root))
        return result


    def postorder(self, root):
        res = []
        if not root:
            return res

        stack = []
        prev = None

        while root or stack:
            while root:
                stack.append(root)
                root = root.left
            root = stack.pop()
            if not root.right or root.right == prev:
                ##root.right == prev 用来判断右孩子是否已经访问过了
                res.append(root.val)
                prev = root
                root = None
            else:
                stack.append(root)
                root = root.right
        return res


    def preorder(self, root):
        res = []
        if not root:
            return res

        stack = []
        while stack or root:
            while root:
                res.append(root.val)
                stack.append(root)
                root=root.left

            root = stack.pop()
            root = root.right

        return res

    def inorder(self, root):
        res = []
        stack = []
        while root or stack:
            while root:
                stack.append(root)
                root = root.left

            root = stack.pop()
            res.append(root.val)
            root = root.right

        return res