「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战」
题目
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
例如: 给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
提示:
节点总数 <= 1000
来源:力扣(LeetCode)leetcode-cn.com/problems/co…
解题思路
根据题目意思,我们要把二叉树的每一层节点放在一个数组中,并返回整个二维数组。我们可以用递归的和队列两种方式来实现。
递归方式:从根节点开始,将每个节点的值放在二维数组的第 k 个数组中,如果二维数组没有第 k 个数组,则插入一个空数组。k 也代表节点所在层数。再递归把左右子节点放入第 k + 1 个数组中。
代码实现
递归实现
var levelOrder = function(root) {
//初始化返回值
const ans = []
//把 root 放到 ans 的第 0 个数组中
getResult(root, 0, ans)
return ans
};
/**
* 递归函数的意义:把 root 的值放到 ans 的第 k 个数组当中,k 从 0 开始
*/
var getResult = function(root, k, ans) {
//如果 root 为空时不需要处理
if (!root) return
//如果 ans[k] 不存在,则先向 ans 中增加一个空数组
if (k === ans.length) ans.push([])
//将 root 的值插入第 k 个数组的末尾
ans[k].push(root.val)
//把 root 的左节点的值放到第 k + 1 个数组中
getResult(root.left, k + 1, ans)
//把 root 的右节点的值放到第 k + 1 个数组中
getResult(root.right, k + 1, ans)
}
队列实现
var levelOrder = function (root) {
//如果根节点有值,则入队列
const queue = root ? [root] : []
const ans = []
while (queue.length) {
const arr = []
const len = queue.length
//把当层所有节点(即此刻队列中所有节点)放在 arr 数组中
for (let i = 0; i < len; i++) {
//第一个节点出队列,并且把该节点的两个子节点入队列
const node = queue.shift()
//把当前节点的值插入数组
arr.push(node.val)
//如果前节点的左节点不为空,则加入队列
if (node.left) queue.push(node.left)
//如果前节点的右节点不为空,则加入队列
if (node.right) queue.push(node.right)
}
//当层数组放进返回值数组中
ans.push(arr)
}
return ans
};
如有错误欢迎指出,欢迎一起讨论!