二叉树的遍历

Posted by 王院长 on September 25, 2019

二叉树的遍历(递归与非递归实现)

前序遍历

class Tree():

    def __init__(self, root = root):
        self.root = root

    # 前序遍历非递归实现
    def preorder_no_recursion(self, root):
        stack = []
        res = []
        stack.push((root, False))
        while stack:
            root, visited = stack.pop()
            if not root:
                continue
            if visited:
                res.append(root.val)
            else:
                stack.append((root.right, False))
                stack.append(root.left, False)
                stack.append(root, True)
        return res

    # 上述版本的简化版
    def preorder_simplify(self, root):
        stack = []
        res = []
        stack.push(root)
        while stack:
            root = stack.pop()
            if not root:
                continue
            res.append(root.val)
            stack.append(root.right)
            stack.append(root.left)

    # 前序遍历递归实现
    def preorder_recursion(self, root):
        self.res = []
        def helper(root):
            if not root:
                return
            self.res.append(root.val)
            helper(root.left)
            helper(root.right)
        helper(root)
        return self.res

中序遍历

class Tree():

    def __init__(self, root = root):
        self.root = root

    # 中序遍历非递归实现
    def inorder_no_recursion(self, root):
        stack = []
        res = []
        stack.append((root, False))
        while stack:
            root, visited = stack.pop()
            if not root:
                continue
            if visited:
                res.append(root.val)
            else:
                res.append((root.right, False))
                res.append((root, True))
                res.append((root.left, False))
        return res
        
    # 中序遍历另一种易实现版本
    def inorder_no_recursion(self, root):
        stack = []
        res = []
        while stack or root:
            # if root is not Null, push it to stack
            while root:
                stack.append(root)
                root = root.left
            # the pop is always not Null
            root = stack.pop()
            val = root.val
            res.append(val)
            root = root.right

    # 中序遍历递归实现
    def inorder_recursion(self, root):
        self.res = []
        def helper(root):
            if not root:
                return
            helper(root.left)
            self.res.append(root.val)
            helper(root.right)
        helper(root)
        return self.res

后序遍历

class Tree():

    def __init__(self, root = root):
        self.root = root


    # 后序遍历非递归实现
    def postorder_no_recursion(self, root):
        stack = []
        res = []
        stack.push((root, False))
        while stack:
            root, visited = stack.pop()
            if not root:
                continue
            if visited:
                res.append(root.val)
            else:
                stack.append(root, True)
                stack.append((root.right, False))
                stack.append(root.left, False)
        return res

    # 后续遍历递归实现
    def postorder_recursion(self, root):
        self.res = []
        def helper(root):
            if not root:
                return
            helper(root.left)
            helper(root.right)
            self.res.append(root.val)
        helper(root)

其中,树遍历的非递归实现,统一版本思路按照:更简单的非递归遍历二叉树的方法编写,其优点是特别容易记。