[路飞]_每天刷leetcode_74(二叉树的层序遍历 Binary tree level order traversal)

138 阅读2分钟

「这是我参与2022首次更文挑战的第35天,活动详情查看:2022首次更文挑战

二叉树的层序遍历 Binary tree level order traversal

LeetCode传送门102. 二叉树的层序遍历

题目

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

Given the root of a binary tree, return the level order traversal of its nodes' values. (i.e., from left to right, level by level).

Example:

Input: root = [3,9,20,null,null,15,7]
Output: [[3],[9,20],[15,7]]

Input: root = [1]
Output: [[1]]


Input: root = []
Output: []

Constraints:

  • The number of nodes in the tree is in the range [0, 2000].
  • -1000 <= Node.val <= 1000

思考线


解题思路

一般我们在遍历的时候,最容易的是深度优先(Depth First Search), 但是在今天这道题中我们要层序遍历,所以我们要执行广度优先(Breadth First Search)。 我们可以这样来做这道题

  1. 设一个变量res来存放结果。
  2. 我们把需要层级遍历的元素放入数组中,由于我们要进行层级遍历,所以我们的第一层的数组是[root].
  3. 然后我们自己实现一个bfs函数来实现层级遍历效果。 函数的主要实现两个功能
    1. 把当前层级的内容放到一个数组中,并把数组push到最终的res结果内
    2. 把下一层级的元素放入到一个数组内,并作递归调用bfs;
  4. 当我们执行bfs([root], res), 完成层级遍历,返回res即可得到我们想要的结果。
/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */
function levelOrder(root: TreeNode | null): number[][] {
    if (!root) return []
    const res: number[][] = [];
    bfs([root], res)
    return res;
};

function bfs(layer: TreeNode[], res: number[][]) {
    if (!layer.length) return;
    const next = []
    const layerArr = []
    while (layer.length) {
        const node = layer.shift()
        layerArr.push(node.val)
        node.left && next.push(node.left)
        node.right && next.push(node.right)
    }
    res.push(layerArr)
    bfs(next, res);
}

时间复杂度

O(n): n 为二叉树的节点数,因为我们要访问每一个节点。

这就是我对本题的解法,如果有疑问或者更好的解答方式,欢迎留言互动。