58. 检查是否为对称二叉树

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分钟来学习与思考,在千变万化,类库层出不穷的今天,不要等到找工作时才狂刷题,提倡每日学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值