给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
示例 2:
输入:root = [1]
输出:[[1]]
示例 3:
输入:root = []
输出:[]
提示:
- 树中节点数目在范围 [0, 2000] 内
- -1000 <= Node.val <= 1000
方法一(常规)
解题思路
1.层序遍历顺序就是广度优先遍历
2.不过在遍历时候需要记录当前节点所处的层级,方便将其添加到不同的数组中
解题过程
1.广度优先遍历二叉树
2.遍历过程中,记录每个节点的层级,并将其添加到不同的数组中
代码
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[][]}
*/
var levelOrder = function(root) {
if(!root) return []
const q = [[root, 0]] // 记录节点和层级
const res = []
while(q.length) {
const [n, level] = q.shift()
if(!res[level]) {
res.push([n.val])
}else {
res[level].push(n.val)
}
if(n.left) q.push([n.left, level+1])
if(n.right) q.push([n.right, level+1])
}
return res
};
方法二
解题思路
在时间和空间复杂度上做了优化,实现过程中不需要记录每个节点的层级
时空分析
时间复杂度:O(n)
空间复杂度:O(n)
代码
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[][]}
*/
var levelOrder = function(root) {
if(!root) return []
const q = [root]
const res = []
while(q.length) {
let len = q.length
res.push([])
// 使用len来保证能逐层的加进去,而不需要记录每个节点的level
while(len--) {
const n = q.shift()
res[res.length-1].push(n.val)
if(n.left) q.push(n.left)
if(n.right) q.push(n.right)
}
}
return res
};