二叉树的层序遍历(Binary Tree Level Order Traversal)
题目描述:
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。(即逐层地,从左到右访问所有节点)。
示例:
输入:
3
/ \
9 20
/ \
15 7
输出:
[
[3],
[9, 20],
[15, 7]
]
解题思路:
-
广度优先搜索(BFS):
- 使用队列实现层序遍历。
- 每次遍历一层,将当前层的节点值存入结果数组。
- 将下一层的节点加入队列,直到队列为空。
-
深度优先搜索(DFS):
- 使用递归实现,记录当前层数。
- 将节点值存入对应层的结果数组中。
代码实现(BFS):
function levelOrder(root) {
if (root === null) return []; // 边界条件
const result = []; // 存储结果
const queue = [root]; // 初始化队列
while (queue.length > 0) {
const levelSize = queue.length; // 当前层的节点数
const currentLevel = []; // 存储当前层的节点值
for (let i = 0; i < levelSize; i++) {
const node = queue.shift(); // 取出队头节点
currentLevel.push(node.val); // 将节点值存入当前层
if (node.left !== null) queue.push(node.left); // 将左子节点加入队列
if (node.right !== null) queue.push(node.right); // 将右子节点加入队列
}
result.push(currentLevel); // 将当前层的结果存入最终结果
}
return result; // 返回结果
}
// 测试
function TreeNode(val) {
this.val = val;
this.left = this.right = null;
}
const root = new TreeNode(3);
root.left = new TreeNode(9);
root.right = new TreeNode(20);
root.right.left = new TreeNode(15);
root.right.right = new TreeNode(7);
console.log(levelOrder(root)); // 输出 [[3], [9, 20], [15, 7]]
代码实现(DFS):
function levelOrder(root) {
const result = []; // 存储结果
function dfs(node, level) {
if (node === null) return; // 递归终止条件
if (result.length === level) {
result.push([]); // 如果当前层的结果数组不存在,创建一个新的
}
result[level].push(node.val); // 将节点值存入对应层
dfs(node.left, level + 1); // 递归遍历左子树
dfs(node.right, level + 1); // 递归遍历右子树
}
dfs(root, 0); // 从根节点开始遍历
return result; // 返回结果
}
// 测试
const root = new TreeNode(3);
root.left = new TreeNode(9);
root.right = new TreeNode(20);
root.right.left = new TreeNode(15);
root.right.right = new TreeNode(7);
console.log(levelOrder(root)); // 输出 [[3], [9, 20], [15, 7]]
复杂度分析:
- 时间复杂度:O(n),其中
n是二叉树的节点数。每个节点都会被访问一次。 - 空间复杂度:
- BFS:O(n),队列中最多存储一层的节点数。
- DFS:O(h),其中
h是二叉树的高度。递归调用栈的深度为树的高度。