vlambda博客
学习文章列表

力扣 144. 二叉树的前序遍历

144. 二叉树的前序遍历

题目描述

给定一个二叉树,返回它的前序遍历。

示例:

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

输出: [1,2,3]

进阶: 递归算法很简单,你可以通过迭代算法完成吗?


递归版前序遍历

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        res = []
        def preorder(node):
            if node is None:
                return
            res.append(node.val)
            preorder(node.left)
            preorder(node.right)
        return preorder(root) or res

运行结果:

执行结果:通过
执行用时:48 ms, 在所有 Python3 提交中击败了17.69% 的用户
内存消耗:13.6 MB, 在所有 Python3 提交中击败了5.01% 的用户


递归版一行解

最爱的力扣一行解系列。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        return [root.val] + self.preorderTraversal(root.left) + self.preorderTraversal(root.right) if root else []

运行结果:

执行结果:通过
执行用时:28 ms, 在所有 Python3 提交中击败了99.15% 的用户
内存消耗:13.5 MB, 在所有 Python3 提交中击败了5.01% 的用户


迭代版前序遍历

这里用到了类型区分法,只要掌握了这种方法,二叉树迭代遍历就如砍瓜切菜般简单,它是颜色标记法的改良版。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        res, q = [], [root]
        while q:
            node = q.pop()
            if isinstance(node, TreeNode):
                q.extend([node.right, node.left, node.val])
            elif isinstance(node, int):
                res.append(node)
        return res

运行结果:

执行结果:通过
执行用时:36 ms, 在所有 Python3 提交中击败了87.61% 的用户
内存消耗:13.6 MB, 在所有 Python3 提交中击败了5.01% 的用户


2020.10.27