返回
Leetcode算法题解系列 - 二叉树的层序遍历
前端
2023-10-13 04:14:17
前言
LeetCode算法题解系列,旨在分享刷LeetCode过程中发现的一些思路有趣或者有价值的题目,通过深入浅出的讲解,帮助大家理解算法的本质,提高算法能力。
二叉树的层序遍历
题目
给定一个二叉树,返回其层序遍历结果。
层序遍历是指从上往下,逐层遍历二叉树中的节点。
解题思路
方法一:广度优先搜索
广度优先搜索(BFS)是一种图论算法,它按照每一层的顺序来遍历图中的节点。在二叉树中,层序遍历相当于对二叉树进行广度优先搜索。
算法步骤
- 首先,我们需要创建一个队列,用来存储要访问的节点。
- 然后,将二叉树的根节点加入队列。
- 接下来,只要队列不为空,我们就从队列中取出第一个节点并访问它。
- 然后,我们将这个节点的左右子节点加入队列。
- 重复步骤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)是一种图论算法,它按照每一层的顺序来遍历图中的节点。在二叉树中,层序遍历相当于对二叉树进行深度优先搜索。
算法步骤
- 首先,我们需要创建一个栈,用来存储要访问的节点。
- 然后,将二叉树的根节点加入栈。
- 接下来,只要栈不为空,我们就从栈中取出第一个节点并访问它。
- 然后,我们将这个节点的左右子节点加入栈。
- 重复步骤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;
};
总结
层序遍历是二叉树的一种遍历方式,它按照每一层的顺序来遍历二叉树中的节点。层序遍历可以使用广度优先搜索或深度优先搜索来实现。广度优先搜索按照每一层的顺序来访问节点,而深度优先搜索按照每一层中的顺序来访问节点。
本题的实现中,我们使用广度优先搜索来实现层序遍历。我们使用一个队列来存储要访问的节点,并从队列中取出第一个节点并访问它,然后将这个节点的左右子节点加入队列。重复这个过程,直到队列为空。