返回

逆向思维:从 LeetCode 107 探索层次遍历的别样风景

前端

在计算机科学中,算法和数据结构是构建软件的基础。LeetCode作为一个知名的在线编程学习平台,提供了大量的算法题目,帮助开发者提升技能。今天,我们将探讨 LeetCode 第 107 题:“二叉树的层序遍历 II”,并通过逆向思维来探索这个问题的解决方案。

问题描述

传统的二叉树层序遍历是从根节点开始,逐层向下访问每个节点。然而,LeetCode 107 题要求我们从叶子节点开始,逐层向上遍历二叉树。这种逆向思维不仅挑战了我们对算法的理解,还加深了对数据结构的认识。

逆向思维的魅力

逆向思维要求我们从结果出发,反推问题的解决方案。在 LeetCode 107 题中,我们需要先构建一个从叶子节点到根节点的路径,然后根据这些路径重建二叉树。这种逆向操作使得问题变得更加直观和易于解决。

递归与迭代:两种实现方式

递归方式

递归是一种自然的逆向思维实现方式。我们可以利用递归函数来遍历树的每一层,并在遍历过程中记录每个节点的父节点。这样,当我们从叶子节点开始向上回溯时,就可以根据记录的父节点信息重建整个二叉树。

def buildTree(nodes, index):
    if index >= len(nodes) or nodes[index] is None:
        return None

    node = TreeNode(nodes[index])
    node.left = buildTree(nodes, 2 * index + 1)
    node.right = buildTree(nodes, 2 * index + 2)
    return node

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

    res = []
    nodes = []
    queue = [root]
    while queue:
        node = queue.pop(0)
        nodes.append(node.val)
        if node.left:
            queue.append(node.left)
        if node.right:
            queue.append(node.right)

    res = buildTree(nodes, 0)
    return res

迭代方式

迭代方法通过使用队列来存储每一层的节点,并逐层处理这些节点。与递归不同,迭代方法不需要函数调用栈,因此在处理大规模数据时可能更加高效。

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

    res = []
    queue = [root]
    while queue:
        n = len(queue)
        level = []
        for _ in range(n):
            node = queue.pop(0)
            level.append(node.val)
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)

        res.insert(0, level)

    return res

总结

通过 LeetCode 107 题,我们不仅学习了一道算法题目,更领略了逆向思维的魅力。递归和迭代两种实现方式各有优劣,选择哪种方法取决于具体问题的需求和数据规模。

关键点回顾

  1. 逆向思维:从结果出发,反推问题解决方案。
  2. 递归与迭代:递归利用函数调用栈,迭代使用队列存储节点。
  3. 数据结构:理解二叉树的结构和层次遍历的逻辑。

资源链接

  • LeetCode 官方网站:https://leetcode.com/
  • 《算法图解》:一本介绍算法和数据结构的经典书籍。

通过不断探索和实践,我们可以在计算机科学的海洋中找到更多属于自己的宝藏。希望本文能为你在算法学习之旅中提供一些帮助和启发。