返回

掌握LeetCode每日一题:巧用递归和栈解构二叉树前序遍历

前端

前言

欢迎来到【小Y学算法】系列的第六天!今天,我们将深入剖析一道LeetCode经典题目——39. 二叉树的前序遍历。通过探索递归和栈这两种巧妙的解法,我们将揭开前序遍历的神秘面纱,带你轻松征服这道题!

什么是二叉树前序遍历?

在二叉树的前序遍历中,我们按照根结点 -> 左子树 -> 右子树 的顺序访问每个结点。也就是说,先访问根结点,然后递归地访问左子树的所有结点,最后再递归地访问右子树的所有结点。

递归解法

递归的思想是将问题分解成较小的子问题,然后逐步解决这些子问题。对于前序遍历,我们可以将二叉树分解成根结点、左子树和右子树三个部分。

def preorderTraversal(root):
    if not root:
        return []

    result = []
    result.append(root.val)
    result.extend(preorderTraversal(root.left))
    result.extend(preorderTraversal(root.right))

    return result

栈解法

栈是一种先进后出(LIFO)的数据结构。它非常适合用于前序遍历,因为前序遍历的顺序与栈中元素出栈的顺序完全一致。

def preorderTraversal(root):
    if not root:
        return []

    stack = [root]
    result = []

    while stack:
        node = stack.pop()
        result.append(node.val)

        if node.right:
            stack.append(node.right)

        if node.left:
            stack.append(node.left)

    return result

LeetCode示例

现在,让我们来看一个LeetCode的示例:

输入:
     1
    / \
   2   3
  / \
 4   5
输出:[1,2,4,5,3]

使用递归解法:

# 定义二叉树结点类
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

# 创建二叉树
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)

# 前序遍历二叉树
result = preorderTraversal(root)
print(result)  # 输出:[1, 2, 4, 5, 3]

使用栈解法:

# 定义二叉树结点类
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

# 创建二叉树
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)

# 前序遍历二叉树
result = preorderTraversal(root)
print(result)  # 输出:[1, 2, 4, 5, 3]

总结

通过递归和栈这两种不同的解法,我们深入理解了二叉树的前序遍历。两种解法各有优缺点,递归解法较为简洁直观,而栈解法在处理大型二叉树时效率更高。

希望今天的讲解能帮助你轻松应对LeetCode每日一题中的二叉树前序遍历题目。持续关注【小Y学算法】系列,解锁更多算法秘籍!