二叉树的直径(LeetCode 543)

文章目录

  • 1.问题描述
  • 2.难度等级
  • 3.热门指数
  • 4.解题思路
  • 参考文献

1.问题描述

给你一棵二叉树的根节点,返回该树的直径 。

二叉树的 直径 是指树中任意两个节点之间最长路径的长度 。这条路径可能经过也可能不经过根节点 root 。

两节点之间路径的长度由它们之间边数表示。

示例 1:

在这里插入图片描述

输入:root = [1,2,3,4,5]
输出:3
解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。

示例 2:

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

2.难度等级

Easy。

3.热门指数

★★★★☆

4.解题思路

可以深度优先搜索最长路径。

遍历每个结点作为根结点的最长路径上的结点数,其最长路径结点数等于其左子树与右子树高度和加 1。

在这里插入图片描述
如图我们可以知道路径 [9, 4, 2, 5, 7, 8] 可以被看作以 2 为根,从其左子树向下遍历的路径 [2, 4, 9] 和从其右子树向下遍历的路径 [2, 5, 7, 8] 拼接得到。

所以解决该题需要先知道如何求解二叉树的高度。

如果我们知道了左子树和右子树的最大深度 l 和 r,那么该二叉树的最大深度即为:max(l,r)+1。

而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用「深度优先搜索」的方法来计算二叉树的最大深度。具体而言,在计算当前二叉树的最大深度时,可以先递归计算出其左子树和右子树的最大深度,然后在 O(1) 时间内计算出当前二叉树的最大深度。递归在访问到空节点时退出。

知道了如何求解二叉树的高度之后,那么在递归搜索过程中记录当前结点作为根结点的最长路径。该最长路径就是整个二叉树的最长路径。

注意,题目要求的是最长路径上的边数,而不是结点数,所以最后返回时要减一。

时间复杂度: O(n),其中 n 为二叉树的结点数,即遍历一棵二叉树的时间复杂度,每个结点只被访问一次。

空间复杂度: 递归函数分配栈空间为 O(logn),即二叉树的高度。

下面以 Golang 为例给出实现。

var path intfunc height(node *TreeNode) int {if node == nil {return 0}lh := height(node.Left)rh := height(node.Right)if lh+rh+1 > path {path = lh + rh + 1}if lh > rh {return lh + 1}return rh + 1
}func diameterOfBinaryTree(root *TreeNode) int {path = 0height(root)return path - 1
}

参考文献

543. 二叉树的直径- LeetCode

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS Linux操作系统源码安装最新Redis版本,使用JSON数据类型踩入新坑

最近有空查阅了redis官网,发现redis数据类型不止Strings、Lists、Sets、Hashes、Sorted sets,还多了几种,决定先试用下JSON数据类型 1、安装Redis软件 JSON数据类型,对Redis版本有要求,需要大于4.0版本。下图是华为云…

开源项目介绍

浙大高飞课题组 微分平坦 微分平坦的思想是:一个全维度的状态空间可以被一组低维的精心挑选的输出平坦空间(flat-output space)的变量及其导数的代数组合的方式所表示。由此,轨迹规划就可以在这组精心挑选的变量的空间所进行。 …

【C++提高编程(二)】

一、STL初识 1.1、STL的诞生 长久以来,软件界一直希望建立一种可重复利用的东西 C的面向对象和泛型编程思想,目的就是复用性的提升 大多情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作 为了建立数据结构和算法的一套标…

一文详解 Berachain 测试网:全面介绍与教程,bitget wallet教程

什么是Berachain? Berachain(web3.bitget.com/zh-CN/assets/berachain-wallet)是一种尖端区块链技术,使用 Cosmos SDK 构建的 Layer-1,兼容以太坊虚拟机(EVM)。它基于一种独特的概念&#xff0c…

【AI】人工智能和图像编码(2)

传统图像编解码与智能图像编解码,都是要编码和解码,但还是有一些区别的。 相关相同点和要点描述如下: 一、区别 1.1 技术原理 传统图像编解码:主要依赖于固定的算法和标准,如JPEG、MPEG等,进行图像的压…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--机器人相关、强化学习

专属领域论文订阅 VX 扫吗关注{晓理紫|小李子},每日更新论文,如感兴趣,请转发给有需要的同学,谢谢支持 分类: 大语言模型LLM视觉模型VLM扩散模型视觉导航具身智能,机器人强化学习开放词汇,检测分割 [晓理紫…

LeetCode、2542. 最大子序列的分数【中等,排序+小顶堆】

文章目录 前言LeetCode、2542. 最大子序列的分数【中等,排序小顶堆】题目及类型思路及代码实现 资料获取 前言 博主介绍:✌目前全网粉丝2W,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领…

2024最新AWVS/Acunetix Premium v24.1.24高级版漏洞扫描器Windows/Linux下载

前言 Acunetix Premium 是一种 Web 应用程序安全解决方案,用于管理多个网站、Web 应用程序和 API 的安全。集成功能允许您自动化 DevOps 和问题管理基础架构。 Acunetix Premium:全面的 Web 应用程序安全解决方案 Web 应用程序对于企业和组织与客户、合作…

算法练习-替换数字(思路+流程图+代码)

难度参考 难度:简单 分类:字符串 难度与分类由我所参与的培训课程提供,但需要注意的是,难度与分类仅供参考。以下内容均为个人笔记,旨在督促自己认真学习。 题目 给定一个字符串S,它包含小写字母和数字字符&#xff0…

设备巡检系统开发及部署

**凡尔码设备巡检系统**是一种低代码模块搭建设备管理系统平台;用户可通过平台开发好的组件像搭积木一般灵活搭建设备管理平台和无纸化应用场景。凡尔码平台功能组件:二维码管理、表单管理、流程管理、计划管理、权限管理、隐患管理、区域管理、记录管理…

数据结构之二叉树的性质与存储结构

数据结构之二叉树的性质与存储结构 1、二叉树的性质2、二叉树的存储结构 数据结构是程序设计的重要基础,它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发,分析和研究计算机加工的数据的特性,…

【趣味题-03】20240120猴子吃桃( 从大到小insert ,列表元素互减)

背景需求: 猴子摘桃的题目 解决: 猴子吃桃 倍数问题 作者:阿夏 时间:2024年1月20日猴子吃桃问题-1 猴子第一天摘了许多桃子,第一天吃了一半,;第二天又吃了一半, 后面每天都是这样吃…

【Java】HttpServlet类简单方法和请求显示

1、HttpServlet类简介🍀 Servlet类中常见的三个类有:☑️HttpServlet类,☑️HttpServletRequest类,☑️HttpResponse类 🐬其中,HttpServlet首先必须读取Http请求的内容。Servlet容器负责创建HttpServlet对…

Deepin_Ubuntu_查看树形目录结构(tree)

Linux系统(Deepin、Ubuntu)中,可以使用tree命令来查看树形目录结构,下面是一些示例: 查看当前目录的树形结构: tree查看指定目录的树形结构,例如/etc/X11/fonts目录: tree /etc/X…

CentOS 7安装Java并配置环境

一、安装Java环境 1、检查系统是否安装Java [rootlocalhost ~]# java -version 2、更新系统软件包 [rootlocalhost ~]# yum update #遇到[y/n],选择y并回车,耐心等待下载完毕,之后系统会自动检验更新的软件包遇到 /var/run/yum.pid 已被锁定 /var/…

【Go面试向】实现map稳定的有序遍历的方式

问题 大家好 我是寸铁👊 总结了一篇实现map稳定的有序遍历的方式探讨的文章✨ 喜欢的小伙伴可以点点关注 💝 你对 map 了解多少?如果要实现第一个稳定的有序遍历有哪些方式? 回答 你对 map 了解多少? 我对map有一定的…

Centos7 如何设置开机启动某个程序

以设置自动启动sentinel-dashboard作为案例 要在CentOS 7上设置开机启动一个Java程序,你可以按照以下步骤进行操作: 1. 进入应用程序的目录 cd /usr/localvim sentinel-dashboard.sh 2. 在sentinel-dashboard.sh 文件中 输入启动脚本 nohup java -D…

『C++成长记』模板

🔥博客主页:小王又困了 📚系列专栏:C 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、泛型编程 二、函数模板 📒2.1函数模板概念 📒2.2函数…

[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式

前言: 为什么之前写过Golang 版的设计模式,还在重新写Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上uml 因为很…

双指针算法专题

前言 双指针算法入门,干就完了 下面的题目都是来自灵神的基础算法精讲,有思路不清晰的地方,可以去看讲解。 灵茶山艾府的个人空间-灵茶山艾府个人主页-哔哩哔哩视频 (bilibili.com) 相向双指针 1.两数之和 题目链接:167. 两数之…