「这是我参与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)。 我们可以这样来做这道题
- 设一个变量
res来存放结果。 - 我们把需要层级遍历的元素放入数组中,由于我们要进行层级遍历,所以我们的第一层的数组是
[root]. - 然后我们自己实现一个
bfs函数来实现层级遍历效果。 函数的主要实现两个功能- 把当前层级的内容放到一个数组中,并把数组
push到最终的res结果内 - 把下一层级的元素放入到一个数组内,并作递归调用
bfs;
- 把当前层级的内容放到一个数组中,并把数组
- 当我们执行
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 为二叉树的节点数,因为我们要访问每一个节点。
这就是我对本题的解法,如果有疑问或者更好的解答方式,欢迎留言互动。