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

二叉树题目:二叉树的直径

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:二叉树的直径

出处:543. 二叉树的直径

难度

3 级

题目描述

要求

给定二叉树的根结点 root \texttt{root} root,返回其直径长度。

二叉树的直径是任意两个结点之间的最长路径长度。这条路径可能穿过也可能不穿过根结点。

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

示例

示例 1:

示例 1

输入: root = [1,2,3,4,5] \texttt{root = [1,2,3,4,5]} root = [1,2,3,4,5]
输出: 3 \texttt{3} 3
解释: 3 \texttt{3} 3 是路径 [4,2,1,3] \texttt{[4,2,1,3]} [4,2,1,3] [5,2,1,3] \texttt{[5,2,1,3]} [5,2,1,3] 的长度。

示例 2:

输入: root = [1,2] \texttt{root = [1,2]} root = [1,2]
输出: 1 \texttt{1} 1

数据范围

  • 树中结点数目在范围 [1, 10 4 ] \texttt{[1, 10}^\texttt{4}\texttt{]} [1, 104]
  • -100 ≤ Node.val ≤ 100 \texttt{-100} \le \texttt{Node.val} \le \texttt{100} -100Node.val100

解法

思路和算法

二叉树中的任意一条路径一定经过某个子树的根结点,子树可以是二叉树本身。

对于任意一个子树而言,经过该子树根结点的最长路径(以下称为「最长路径」,均指包含根结点的最长路径)一定满足以下条件:如果左子树不为空,则最长路径的左端是左子树的最深叶结点,否则最长路径的左端是根结点;如果右子树不为空,则最长路径的右端是右子树的最深叶结点,否则最长路径的右端是根结点。因此,子树的最长路径长度为该子树的左子树和右子树的深度之和,子树的深度为该子树的左子树和右子树的深度的较大值加 1 1 1。此处的深度定义为二叉树中结点的层数,如果二叉树为空则深度为 0 0 0,如果二叉树只有一个结点则深度为 1 1 1

由于二叉树的最长路径长度和二叉树的深度都取决于左子树和右子树的深度,因此可以使用深度优先搜索计算二叉树的深度,计算过程中得到二叉树的直径。

计算二叉树的深度的过程是一个递归的过程,递归的终止条件是当前结点为空,此时深度为 0 0 0。其余情况下,首先得到当前结点的左子树和右子树的深度,然后计算以当前结点为根结点的二叉树的深度和最长路径长度,并维护二叉树的直径。遍历结束之后,即可得到二叉树的直径。

代码

class Solution {int diameter = 0;public int diameterOfBinaryTree(TreeNode root) {getDepth(root);return diameter;}public int getDepth(TreeNode node) {if (node == null) {return 0;}int leftDepth = getDepth(node.left);int rightDepth = getDepth(node.right);diameter = Math.max(diameter, leftDepth + rightDepth);return Math.max(leftDepth, rightDepth) + 1;}
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点都被访问一次。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是递归调用的栈空间,取决于二叉树的高度,最坏情况下是 O ( n ) O(n) O(n)

http://www.lryc.cn/news/123231.html

相关文章:

  • 嵌入式:C高级 Day4
  • cmake常用命令(1)——函数相关
  • 阿里三年功能测试的一些感悟
  • React源码解析18(4)------ completeWork的工作流程【mount】
  • Kafka: 详解、使用教程和示例
  • 【LeetCode周赛】LeetCode第358场周赛
  • Node.js学习笔记-04
  • 基于dbn+svr的交通流量预测,dbn详细原理
  • 【第一阶段】kotlin中反引号中的函数名特点
  • 数据分析-python学习 (1)numpy相关
  • 数据库的游标
  • 【设计模式】前端控制器模式
  • SQL | 过滤数据
  • 【力扣每日一题】2023.8.13 合并两个有序数组
  • 数据结构篇七:排序
  • Vue组件的边界情况
  • less、sass的使用及其区别
  • [保研/考研机试] 猫狗收容所 C++实现
  • Kotlin 基础教程一
  • 数据结构笔记--前缀树的实现
  • C/C++时间获取函数
  • sql中判断日期是否是同一天
  • NAS搭建指南一——服务器的选择与搭建
  • 豪越HYDO智能运维助力智慧医院信息化建设
  • Week1题目重刷
  • 考研数据结构:第七章 查找
  • 【Linux进程篇】环境变量
  • 【软件测试】Linux环境下Docker搭建+Docker搭建MySQL服务(详细)
  • 去了字节跳动,才知道年薪40W的测试有这么多?
  • linux0.95(VFS重点)源码通俗解读(施工中)