返回

Leetcode算法题解系列 - 二叉树的层序遍历

前端

前言

LeetCode算法题解系列,旨在分享刷LeetCode过程中发现的一些思路有趣或者有价值的题目,通过深入浅出的讲解,帮助大家理解算法的本质,提高算法能力。

二叉树的层序遍历

题目

给定一个二叉树,返回其层序遍历结果。

层序遍历是指从上往下,逐层遍历二叉树中的节点。

解题思路

方法一:广度优先搜索

广度优先搜索(BFS)是一种图论算法,它按照每一层的顺序来遍历图中的节点。在二叉树中,层序遍历相当于对二叉树进行广度优先搜索。

算法步骤

  1. 首先,我们需要创建一个队列,用来存储要访问的节点。
  2. 然后,将二叉树的根节点加入队列。
  3. 接下来,只要队列不为空,我们就从队列中取出第一个节点并访问它。
  4. 然后,我们将这个节点的左右子节点加入队列。
  5. 重复步骤3和4,直到队列为空。

代码实现

/*
 * 给定一个二叉树,返回其层序遍历结果。
 *
 * 层序遍历是指从上往下,逐层遍历二叉树中的节点。
 *
 * 示例:
 *
 * 给定二叉树:
 *
 *     1
 *    / \
 *   2   3
 *  / \
 * 4   5
 *
 * 返回:
 *
 * [
 *   [1],
 *   [2, 3],
 *   [4, 5]
 * ]
 */
const levelOrder = (root) => {
  if (!root) {
    return [];
  }

  const queue = [];
  const result = [];

  queue.push(root);

  while (queue.length) {
    const level = [];

    const size = queue.length;
    for (let i = 0; i < size; i++) {
      const node = queue.shift();
      level.push(node.val);

      if (node.left) {
        queue.push(node.left);
      }

      if (node.right) {
        queue.push(node.right);
      }
    }

    result.push(level);
  }

  return result;
};

方法二:深度优先搜索

深度优先搜索(DFS)是一种图论算法,它按照每一层的顺序来遍历图中的节点。在二叉树中,层序遍历相当于对二叉树进行深度优先搜索。

算法步骤

  1. 首先,我们需要创建一个栈,用来存储要访问的节点。
  2. 然后,将二叉树的根节点加入栈。
  3. 接下来,只要栈不为空,我们就从栈中取出第一个节点并访问它。
  4. 然后,我们将这个节点的左右子节点加入栈。
  5. 重复步骤3和4,直到栈为空。

代码实现

/*
 * 给定一个二叉树,返回其层序遍历结果。
 *
 * 层序遍历是指从上往下,逐层遍历二叉树中的节点。
 *
 * 示例:
 *
 * 给定二叉树:
 *
 *     1
 *    / \
 *   2   3
 *  / \
 * 4   5
 *
 * 返回:
 *
 * [
 *   [1],
 *   [2, 3],
 *   [4, 5]
 * ]
 */
const levelOrder = (root) => {
  if (!root) {
    return [];
  }

  const stack = [];
  const result = [];

  stack.push(root);

  while (stack.length) {
    const level = [];

    const size = stack.length;
    for (let i = 0; i < size; i++) {
      const node = stack.pop();
      level.push(node.val);

      if (node.right) {
        stack.push(node.right);
      }

      if (node.left) {
        stack.push(node.left);
      }
    }

    result.push(level);
  }

  return result;
};

总结

层序遍历是二叉树的一种遍历方式,它按照每一层的顺序来遍历二叉树中的节点。层序遍历可以使用广度优先搜索或深度优先搜索来实现。广度优先搜索按照每一层的顺序来访问节点,而深度优先搜索按照每一层中的顺序来访问节点。

本题的实现中,我们使用广度优先搜索来实现层序遍历。我们使用一个队列来存储要访问的节点,并从队列中取出第一个节点并访问它,然后将这个节点的左右子节点加入队列。重复这个过程,直到队列为空。