leetcode-二叉树——前中后序遍历

树的遍历

①前序遍历:先遍历根节点,再遍历左节点,再遍历右节点
②中序遍历:先遍历左节点,再遍历根节点,再遍历右节点
③后序遍历:先遍历左节点,在遍历右节点,再遍历根节点

实现思路

对二叉树中任何一个节点而言,它都有两个角色需要扮演,一个是作为值存储(角色1),另一个角色是作为它所代表的一个子树的代表(角色2)。而我们设置bool变量,就是为了说明我当前拿到的这个节点,应该是以一个值存储的角色对待它(True),还是以一个子树的代表的这种角色对待它(False),如果是前者,那么就将其所有存储的值打印出来,如果是后者,我们需要继续探索由它带领的子树。

前序代码实现

image.png
class Solution:
    def preorderTraversal(self, root):
        res = []
        if not root:
            return res
        stack = [(root, False)]
        while stack:
            node, vis = stack.pop()
            if vis:
                res.append(node.val)
            else:
                if node.right:
                    stack.append((node.right,False))
                if node.left:
                    stack.append((node.left,False))
                stack.append((node, True))
        return res

中序代码实现

image.png
class Solution(object):
    def inorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if root is None:
            return []
        rt = [(root, False)]
        res = []
        while rt:
            cur,vis = rt.pop()
            if vis:
                res.append(cur.val)
            else:
                if cur.right:
                    rt.append((cur.right, False))
                rt.append((cur, True))          
                if cur.left:
                    rt.append((cur.left, False))
        return res

后序代码实现

image.png
class Solution(object):
    def postorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if root is None:
            return []
        ra = [(root, False)]
        res = []
        while ra:
            cur, vis = ra.pop()
            if vis:
                res.append(cur.val)
            else:
                ra.append((cur,True))
                if cur.right:
                    ra.append((cur.right, False))
                if cur.left:
                    ra.append((cur.left, False))
        return res

参考文章: https://zhuanlan.zhihu.com/p/30490183

你可能感兴趣的:(leetcode-二叉树——前中后序遍历)