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 消耗深度​​​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/148614.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3使用通信组件库mitt作为事件总线实现跨组件通信

mitt 介绍: Mitt 是一个在 Vue.js 应用程序中使用的小型事件总线库。该库允许组件进行通信,而不必过度依赖父级或子级组件之间的 props。 先看项目用例: 【 以下转载自:https://blog.csdn.net/yuanlong12178/article/details/139579299 】…

无人机飞手教员培训持证,必须会组装,模拟,维修才能带好学员

无人机飞手员的教培训不应仅仅局限于获取飞行执照或证书,而应是一个全面等多、方面的深入能力且,实践以确保导向能够的过程全面。、一个有效地合格的指导无人机学员飞。手教员不仅需要掌握扎实的飞行技能,还需要具备组装、模拟训练、维修。 组…

线性调频信号脉冲压缩并非是一个门信号

如果是频域是门信号,时域是sinc信号,时间越长震荡只会越小。图象是线性卷积做的,肯定没错。

SGLang——结构化语言模型程序的高效执行

前言 大型语言模型 (LLM) 越来越多地用于需要多次生成调用、高级提示技术、控制流和结构化输入/输出的复杂任务。然而,缺乏用于编程和执行这些应用程序的高效系统。新推出的系统 SGLang 旨在通过提供复杂语言模型程序的高效执行来解决这一问题。SGLang 包含前端语言…

828华为云征文|华为云Flexus X轻松实现Redis一主多从高效部署

目录 前言 一、华为云Flexus X加速Redis购买 1.1 Flexus X实例购买 1.2 Redis加速镜像选择 1.3 重置密码 1.4 登录Flexus X实例 1.5 Flexus X实例Redis验证 二、华为云Flexus X主节点Redis配置 2.1 重置密码 2.2 Redis外部访问配置 三、华为云Flexus X从节点Redis配置 3.1 从机…

亚马逊商品详情数据接口:提升运营排名的工具

亚马逊商品详情数据接口是亚马逊平台提供的一种服务,允许用户通过程序调用API(应用程序接口)来获取亚马逊商品的相关数据。这个接口为开发者和商家提供了丰富的商品信息,有助于优化用户体验、支持购买决策、竞品分析和市场研究等。…

Comfyui海报工作流:出图快,质量高!

前言 工作流获取方式放在这里了 在快节奏的现代生活中,高效的工作流程对于企业和个人而言,无疑是提升竞争力的关键。 特别是在设计领域,能够快速而精准地完成海报设计,不仅意味着时间的节省,更代表着工作效率的飞跃。…

玩转图像处理:Python与OpenCV实现高效绿幕背景替换

文章目录 前言色度抠图技术(Chroma Keying)基本原理 数据准备代码实现性能分析代码优化优化后的速度 前言 现阶段绿幕抠图有很多种方式,比如色度抠图(Chroma Keying)、亮度抠图(Luma Keying)、色…

win7系统安装高于13.14.0版本的node及遇到问题

背景 原项目是在win10系统上,使用的是node16.10.0版本,使用的vite开发,现在需要去客户现场进行开发,提供的电脑是win7系统,因为win7系统支持的最高版本node是13.14.0,所以我们需要降低node版本&#xff0c…

深化战略合作|义翘神州与百奥几何扩大合作:生成式AI深度赋能蛋白研发

近日,重组蛋白领军企业义翘神州与前沿数字生物企业百奥几何达成战略合作,将蛋白表达湿实验平台与生成式AI蛋白设计和改造有机结合。在前期项目成功合作的基础上,双方决定进一步深化合作,合力开拓高附加值市场需求。 当前&#xf…

opencv实战项目二十五:复杂背景下的直线提取

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、简介二,算法实现:2.1 中值滤波去噪2.2滤波图像取反并提取直线2.3 二值图细化2.4 对细化后的直线进行霍夫变换 前言 在当今计算机视…

超越想象的声音修复——iZotope RX 11,重塑音频处理的未来

iZotope RX 11是一款功能强大的音频修复和增强软件,专为音频后期制作、音乐制作和内容创作而设计。以下是其主要功能和用途的详细概述: iZotope RX 11 苹果Mac软件下载 iZotope RX 11 Windows软件下载 主要功能 智能降噪与修复: RX 11配备了…

ARM相关概念

ARM课程大纲 ARM相关的基本概念 机器码 计算机能够识别由1和0组成的编码格式 汇编:将汇编文件转换为二进制文件(.bin/.elf) 汇编指令 是一条具备特殊功能的指令 编译:生成汇编文件 int a 10; ------> mov r0 #10 …

Qt/C++ 了解NTFS文件系统,解析0x80 $Data属性,获取Run Lists数据列表

系列文章目录 整个专栏系列是根据GitHub开源项目NTFS-File-Search获取分区所有文件/目录列表的思路。 具体的如下: Qt/C 了解NTFS文件系统,了解MFT(Master File Table)主文件表(一) 介绍NTFS文件系统,对比通过MFT(Master File Tab…

springboot中小学数字化教学资源管理平台

基于springbootvue实现的中小学数字化教学资源管理平台 (源码L文ppt)4-078 第4章 系统设计 4.1 功能模块设计 系统整体模块分为管理员、教师和学生三大用户角色,整体功能设计图如下所示: 图4-1 系统整体功能图 4.2 数据库设计 4.2.1 E-R模…

工业交换机故障快速排查的方法有哪些

在现代工业自动化的环境中,工业交换机作为网络连接的重要设备,其稳定性和可靠性至关重要。然而,实际使用过程中难免会遇到各种故障,这对生产线和系统的正常运作造成了影响。为了有效应对这些问题,下面将介绍一些工业交…

CSRF高级防御绕过

1)回顾low级别做过csrf页面的密码重置,重复之前的操作,我们发现级别调整中级之后,报错如下 2)检查源码 进入dvwa源码,查找到checktoken: 3)在dvwa-csrf页面上,抓包 http…

前端开发者有福啦,循序渐进Vue.js 3.x前端开发实践已上线

目录 写在前面 推荐图书 推荐理由 写在最后 写在前面 好书推荐!前端开发者的福利来喽,《循序渐进Vue.js 3.x前端开发实践》,你值得拥有。 推荐图书 《循序渐进Vue.js 3.x前端开发实践》 推荐理由 《循序渐进Vue.js 3.x前端开发实践》…

介绍GPT-o1:一系列解决困难问题( science, coding, and math )的推理模型

openai o1介绍 一、官方技术报告要点剖析实验1 benchmark分析实验2:和phd比赛技术细节:Chain of Thought的使用人类偏好评估Human preference evaluationsatety技术细节:隐藏思维链为监控模型提供了机会:)openai的几点conclusion 二、官方介绍剖析 Intro…

【C语言进阶】第四节:自定义类型详解

1、结构体 1.1 结构体变量的定义和初始化 struct Point//类型声明 {int x;int y; }p1;//声明类型的同时定义变量p1struct Point p2;//定义结构体变量p2//初始化:定义变量的同时赋初值。 struct Point p3 { x, y };struct Node {int data;struct Point p;struct N…