57期问题及答案
二叉树的层序遍历
题目描述:
给定一个二叉树,返回其按层序遍历得到的节点值(即逐层地,从左到右访问所有节点)。
示例:
二叉树如下所示:
3
/ \
9 20
/ \
15 7
返回其层序遍历结果:
[
[3],
[9,20],
[15,7]
]
提示:
树中节点的数目范围是
[0, 2000]
-1000 <= Node.val <= 1000
以下是使用 TypeScript 实现的解答:
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[][] {
const result: number[][] = [];
if (root === null) {
return result;
}
const queue: TreeNode[] = [root];
while (queue.length > 0) {
const currentLevelSize = queue.length;
const currentLevel: number[] = [];
for (let i = 0; i < currentLevelSize; i++) {
const node = queue.shift()!;
currentLevel.push(node.val);
if (node.left) {
queue.push(node.left);
}
if (node.right) {
queue.push(node.right);
}
}
result.push(currentLevel);
}
return result;
}
解题思路:
使用广度优先搜索(BFS)来进行层序遍历。
初始化一个队列
queue
,用于存储待遍历的节点。将根节点加入队列,然后进行循环遍历。
在循环中,首先获取当前层的节点数量
currentLevelSize
,这是为了控制内层循环的次数,保证每层只遍历当前层的节点。使用内层循环遍历当前层的节点,每次从队列中取出一个节点,将其值存入
currentLevel
数组,然后将其左右子节点加入队列。循环结束后,将
currentLevel
数组存入result
数组中。最终返回
result
数组,其中存储了按层序遍历得到的节点值。
时间复杂度分析:
遍历二叉树的每个节点一次,时间复杂度为 O(N),其中 N 是二叉树的节点数。
空间复杂度分析:
使用了队列来辅助层序遍历,最多会同时存储一层的节点,所以空间复杂度为 O(W),其中 W 是二叉树中最宽的层的节点数。最坏情况下,树的最宽层会占用队列的空间,最坏情况下空间复杂度为 O(N)。
58期
检查是否为对称二叉树
题目描述:
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3]
是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3]
则不是镜像对称的。
1
/ \
2 2
\ \
3 3
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?
上面问题的答案会在第二天的公众号推文中公布,大家可以关注公众号:程序员每日三问,第一时间获得推送内容。
学习不打烊,充电加油只为遇到更好的自己,每天早上9点纯手工发布面试题(死磕自己,愉悦大家) 希望大家在这浮夸的程序员圈里保持冷静,每天坚持花20分钟来学习与思考,在千变万化,类库层出不穷的今天,不要等到找工作时才狂刷题,提倡每日学习。