返回

初学者的 LeetCode 树形遍历指南:掌握二叉树的层次遍历 II

见解分享

前言

在计算机科学中,树形数据结构因其有效组织和存储分层数据的特性而备受推崇。二叉树是一种特殊的树形结构,其中每个节点最多有两个子节点:左子节点和右子节点。层次遍历是遍历二叉树的一种常用技术,它按照层次从上到下访问每个节点。

107 题:二叉树的层次遍历 II

LeetCode 的 107 题要求你从底向上对一棵二叉树进行层次遍历,并返回结果。这意味着遍历将从最底层开始,逐层向上移动。

广度优先搜索 (BFS)

层次遍历二叉树的一个有效方法是使用广度优先搜索 (BFS) 算法。BFS 算法遵循先进先出的原则,这意味着它会首先访问队列中的第一个元素,然后依次访问后续元素。

Python 实现

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

    result = []
    queue = [root]

    while queue:
        level_size = len(queue)
        current_level = []

        for _ in range(level_size):
            node = queue.pop(0)
            current_level.append(node.val)

            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)

        result.insert(0, current_level)

    return result

Java 实现

public List<List<Integer>> levelOrderBottom(TreeNode root) {
    List<List<Integer>> result = new LinkedList<>();
    if (root == null) {
        return result;
    }

    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root);

    while (!queue.isEmpty()) {
        int levelSize = queue.size();
        List<Integer> currentLevel = new ArrayList<>();

        for (int i = 0; i < levelSize; i++) {
            TreeNode node = queue.poll();
            currentLevel.add(node.val);

            if (node.left != null) {
                queue.offer(node.left);
            }
            if (node.right != null) {
                queue.offer(node.right);
            }
        }

        result.add(0, currentLevel);
    }

    return result;
}

复杂度分析

  • 时间复杂度:O(N),其中 N 是二叉树中的节点总数。BFS 算法需要遍历每个节点一次。
  • 空间复杂度:O(N),因为在最坏的情况下,队列中可能存储所有节点。

结论

掌握二叉树的层次遍历 II 是解决 LeetCode 107 题的关键。通过使用广度优先搜索 (BFS) 算法,我们可以从底向上遍历二叉树,获得其节点值的层次遍历结果。通过理解 BFS 的工作原理,并结合 Python 或 Java 代码示例,你将能够轻松解决此问题并提升你的算法技能。