前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >“二叉树的最大深度”,竟然有3家大厂在考这道算法题...

“二叉树的最大深度”,竟然有3家大厂在考这道算法题...

作者头像
前端胖头鱼
发布2024-03-14 16:16:09
710
发布2024-03-14 16:16:09
举报
文章被收录于专栏:胖头鱼学前端胖头鱼学前端

前言

最近至少有3个朋友字节小红书蚂蚁的前端面试中遇到了同一道算法题,二叉树的最大深度...

作为leetcode大神的你想必早已露出了惊讶的眼神:“真的吗?这不过是一道简单题而已!!!”

“此事千真万确”胖头鱼敢打包票,简单题也有其面试的价值。让俺们一起瞅瞅这到底是啥题!

题目解析

查看原题

给定一个二叉树 root ,返回其最大深度。

二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。

示例 1:

代码语言:javascript
复制

输入:root = [3,9,20,null,null,15,7]
输出:3

示例 2:

代码语言:javascript
复制

输入:root = [1,null,2]
输出:2
 

提示:

  1. 树中节点的数量在 [0, 104] 区间内。
  2. -100 <= Node.val <= 100

解析

根据题意我们不难看出二叉树的最大深度二叉树的层数非常相似,一起来看看。

例子1

代码语言:javascript
复制

输入:root = [3,9,20,null,null,15,7]
输出:3

  3          <-- 第 1 层
 / \
9  20        <-- 第 2 层
   /  \
  15   7     <-- 第 3 层

例子2

代码语言:javascript
复制
输入:root = [1,null,2] 
输出:2

1          <-- 第 1 层
 \
  2        <-- 第 2 层


解法1:层序遍历

所以我们可以尝试从二叉树的层序遍历开始入手。

层序遍历: 是一种按层级顺序逐层遍历二叉树节点的方法。

从根节点开始,按层级顺序从上到下从左到右依次访问每个节点。在遍历过程中,每一层的节点按照从左到右的顺序加入结果中。

对于示例 [3,9,20,null,null,15,7] 对应的二叉树如下所示:

代码语言:javascript
复制
  3
 / \
9  20
  /  \
 15   7

层序遍历的结果为 [3, 9, 20, 15, 7]。

代码实现如下:

代码语言:javascript
复制

const levelOrder = (root) => {
  if (!root) {
    return []
  }  

  const result = []
  const queue = [ root ]
  
  while (queue.length) {
    // 取出队首节点
    const top = queue.shift()
    // 加入结果
    result.push(top.val)
    // 将左右节点加入队列
    top.left && queue.push(top.left)
    top.right && queue.push(top.right)
  }
  
  return result
}


利用队列的性质,我们可以拿到二叉树层序遍历的值,在此基础上只要我们稍微做一些改变就可以获得二叉树最大的深度

求解二叉树最大的深度

代码语言:javascript
复制
const maxDepth = (root) => {
  if (!root) {
    return 0
  }  
  // 层数
  let depth = 0
  const queue = [ root ]
  
  while (queue.length) {
    // 当前层的节点数,例如第一层是为1、第二层为2
    let len = queue.length
    
    depth++
    
    while (len--) {
      // 取出队首的元素
      const top = queue.shift()
      // 将左右节点加入队列
      top.left && queue.push(top.left)
      top.right && queue.push(top.right)
    }
  }
  
  return depth
}


咱们以输入 root = [3,9,20,null,null,15,7] 为例,解析一下最终获取depth为3的过程。

首先是初始状态,根节点 3 被放入队列中:

代码语言:javascript
复制

queue:[3]
depth:0

首次进入外层while循环,depth增加1最终为1,并且进入内层while循环,内层while循环结束后

代码语言:javascript
复制

queue:[9, 20]
depth:1

再次进入外层while循环,depth增加1最终为2,并且进入内层while循环,内层while循环结束后

代码语言:javascript
复制

queue:[15, 7]
depth:2

最后一次进入外层while循环,depth增加1最终为3,并且进入内层while循环,内层while循环结束后。

代码语言:javascript
复制

queue:[]
depth:3

最后我们获得了最大层数3,也通过leetcode所有的用例测试。

解法二:递归

其中一个朋友看到这道题的时候,他内心大喜,但是又不能表现出来...

还得假装不会这个题,思考了10几秒,你说苦不苦😄,因为使用递归的话,几行代码就搞定了。

代码语言:javascript
复制
var maxDepth = function(root) {
  if (!root) {
    return 0
  }

  return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1
}

我们可以这样理解这个解法:

一个树的最大深度 = 根节点的高度(即1)+ 左右子树的最大深度中的较大者。

拿输入为:[3,9,20,null,null,15,7] 为例

代码语言:javascript
复制
    3
   / \
  9  20
    /  \
   15   7
   
   
1. 根节点是 3,深度为1。
2. 左子树是 [9],深度为1。
3. 右子树是 [20,null,null,15,7],深度为2。
  3.1 右子树的左子树是 15,深度为1。
  3.2 右子树的右子树是 7,深度为1。
因此,整棵树的深度是左右子树深度的较大值加上1,即 max(1, 2) + 1 = 3,最大深度为3。

最后

也许你我素未谋面,但很可能相见恨晚。希望这里能成为你的栖息之地,我愿和你一起收获喜悦,奔赴成长。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端胖头鱼 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 题目解析
  • 解法1:层序遍历
  • 解法二:递归
  • 最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档