当前位置: 首页 > news >正文

Leetcode 每日一题:Diameter of Binary Tree

写在前面:

最近被学校的 campus involvement 社团活动的招新宣传和选拔,以及找工作频繁的参加招聘会和网上申请忙的焦头烂额,马上又要到来的期中考试让我再次意识到了大学生活的险恶。虽然大家都说学生时代是最幸福的时代,但这个幸福也是相对的吧~~

今天我们来一道简单一点的题目练练手,但是这道题目简单并不代表他没有进行深究的价值。理解这道题目的解法对于理解 Binary Tree 的结构,DFS 和 Recursion 的算法应用都有比较深的基础价值和意义,就让我们一起来看看吧!

题目介绍:

  • 题目链接:https://leetcode.com/problems/diameter-of-binary-tree/description/
  • 题目类型:Binary Tree,DFS,Recursion
  • 题目难度:Easy
  • 题目来源:Google 高频面试题

题目想法:

如何确定最大 diameter 来自于哪里:

这道题的难点在于如何确定 最大 diameter 是产出于哪里,因为如果这个产出是随机且没有规律的话,这道题将会变成一道非常困难的问题,所以我们首先要明确如何找出 最大的 diameter 产出于哪里?

最大的 diameter:一定是 leaf node 到另外一个 leaf node

为什么呢? 我们可以做一个简短的举反例证明, proof by contradiction

  • 如果我们的最大 diameter 起终点产出于一个不是 leaf node 的节点
  • 不是 leaf node 节点的 node 一定有至少一个 children 节点
  • 那我们的最大 diameter 就还可以在不影响其任何已经组成节点的情况下新加入一个 leaf node,让其长度 + 1
  • 那原本的这个 不是leaf node 的节点就不能是 最长 diameter
  • 所以最长 diameter 一定是从一个leaf node 到另一个 leaf node

如何 Construct 最大 diameter

既然我们已经确定好了最大的 diameter 一定是从一个 leaf node 到另一个 Leaf node,那我们在每一个点的时候,最大的 diameter 一定是来自于:

maxCurrent = leftMax + rightMax

因为当前这个点,能组成的 diameter 最大就是从他最左侧的 leafnode,到最右侧的 leafnode,这其中最长的一个,又因为我们统计的是 edge 个数,所以就是 左侧最深 + 右侧最深即可

题目解法:

  • DFS 遍历每一个数的节点:
    • ​​​​​​​如果当前节点是空,返回0
    • 当前最大深度 = 左侧最大深度 + 右侧最大深度
    • 更新最大深度
    • 返回当前节点最大深度 = max(左侧最大, 右侧最大)

​​​​​​​​​​​​​​

题目代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int DFS(TreeNode* root, int& maxDepth){if(root == nullptr){return 0;}//update the maxDepth if needed:int leftMax = DFS(root->left, maxDepth);int rightMax = DFS(root->right, maxDepth);maxDepth = max(maxDepth, leftMax + rightMax);//update the current route's max to the upper levelreturn max(leftMax, rightMax) + 1;}int diameterOfBinaryTree(TreeNode* root) {int maxDepth = 0;int maxSubDepth = DFS(root, maxDepth);return maxDepth;}
};
  • Runtime: O(N) 遍历每一个点一次
  • Space:O(N) 有多少个点决定了我们的 recursion 的 space 消耗深度​​​​​​​​​

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • TS React 项目中使用TypeScript
  • 串的存储实现方法(与链表相关)
  • Pybullet 安装过程
  • 面试干货|自动化测试中常见面试题
  • 摆脱困境并在iPhone手机上取回删除照片的所有解决方案
  • 神经网络面试题目
  • Get请求-LocalDateTime的转换问题
  • Python在数据科学与机器学习中的应用
  • 大话Python|基础语法(上)
  • 【监控】【Nginx】使用 Docker 部署 ELK Stack 监控 Nginx
  • Vite + Vue + TypeScript 项目搭建总结
  • 【ComfyUI】自定义节点ComfyUI_LayerStyle——模仿 Adob​​e Photoshop 的图层样式、图层混合、图文混合、添加不可见水印
  • 安卓13去掉下拉菜单的Dump SysUI 堆的选项 android13删除Dump SysUI 堆
  • C语言中数组和字符串的联系
  • OpenAI 刚刚推出 o1 大模型!!突破LLM极限
  • 时间复杂度分析经典问题——最大子序列和
  • Android 控件背景颜色处理
  • Angular 响应式表单之下拉框
  • AWS实战 - 利用IAM对S3做访问控制
  • E-HPC支持多队列管理和自动伸缩
  • HTTP中的ETag在移动客户端的应用
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JS数组方法汇总
  • Python学习之路16-使用API
  • 百度小程序遇到的问题
  • 创建一种深思熟虑的文化
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 对象管理器(defineProperty)学习笔记
  • 利用DataURL技术在网页上显示图片
  • 事件委托的小应用
  • 数组大概知多少
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 一天一个设计模式之JS实现——适配器模式
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • - 转 Ext2.0 form使用实例
  • puppet连载22:define用法
  • 数据可视化之下发图实践
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #laravel 通过手动安装依赖PHPExcel#
  • #pragma once
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (1)(1.11) SiK Radio v2(一)
  • (13)Hive调优——动态分区导致的小文件问题
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (三)uboot源码分析
  • (十七)Flink 容错机制
  • (转)JAVA中的堆栈
  • (转)人的集合论——移山之道
  • (转)重识new
  • *1 计算机基础和操作系统基础及几大协议
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记