二叉樹題目:二叉樹的直徑

文章目錄

  • 題目
    • 標題和出處
    • 難度
    • 題目描述
      • 要求
      • 示例
      • 數據范圍
  • 解法
    • 思路和算法
    • 代碼
    • 復雜度分析

題目

標題和出處

標題:二叉樹的直徑

出處: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.pswp.cn/news/36381.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36381.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36381.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

考研408 | 【計算機網絡】 傳輸層

導圖 傳輸層的功能 傳輸層的兩個協議 傳輸層的尋址與端口 UDP協議 UDP的主要特點 UDP首部格式: UDP校驗: TCP協議 TCP協議的特點 TCP報文段首部格式 TCP連接管理 TCP的連接建立 SYN洪泛攻擊 TCP的連接釋放 TCP可靠傳輸 序號: 確認&#xff1…

ASEMI快恢復二極管APT80DQ20BG怎么檢查好壞

編輯-Z 二極管APT80DQ20BG是一種高壓快恢復二極管,常用于電源和電能質量控制等領域。如果您的二極管出現故障或需要進行維修,以下是一些可能的解決方案。 首先,確保您已經斷開了電源,并且具備基本的電子維修知識和技能。如果您不…

添加vue devtools擴展工具+添加后F12不顯示Vue圖標

前言:在開啟Vue學習之旅時,遇到問題兩個問題,第一添加不上vue devtools擴展工具,第二添加完成后,F12不顯示Vue圖標。查閱了很多博客,自己解決了問題,故寫此博客記錄。如果你遇到和我一樣的問題&…

React源碼解析18(3)------ beginWork的工作流程【mount】

摘要 OK,經過上一篇文章。我們調用了: const root document.querySelector(#root); ReactDOM.createRoot(root)生成了FilberRootNode和HostRootFilber。 并且二者之間的對應關系也已經確定。 而下一步我們就需要調用render方法來講react元素掛載在ro…

【JavaEE進階】SpringBoot 日志

文章目錄 一. 日志有什么用?二. 自定義日志打印1. 日志的使用與打印 三. 日志級別1. 日志級別有什么用?2. 日志級別的分類及使用 四. 日志持久化五. 更簡單的日志輸出---Lombok1. Lombok的使用2. lombok原理解釋2.1 Lombok更多注解說明 一. 日志有什么用? 在Java中&#xf…

【結構型設計模式】C#設計模式之外觀模式

題目描述: 假設你正在開發一個音樂播放器應用程序,該應用程序需要與多個子系統進行交互,包括音頻解碼、音量控制和播放控制等。請使用外觀模式設計一個音樂播放器的外觀類,并實現相應的子系統類。 要求: 創建一個外觀…

【gogogo專欄】指針

go語言指針 為什么需要指針指針使用實例值傳遞地址傳遞多級指針 為什么需要指針 作為一個大學劃水,畢業一直寫java的程序員來說,多多少少對于指針有點陌生,由于近期需要轉go,正好學到指針這里,就來探究下指針的使用場景…

ThreadLocal詳解

ThreadLocal詳解 一、故事背景二、知識點主要構成1、什么是ThreadLocal?2、ThreadLocal的基本使用內存泄漏問題引用類型:強引用:軟引用弱引用虛引用 ThreadLocal內存泄漏原因 三、總結提升 一、故事背景 最近在學習并發編程相關內容&#xf…

pycharm 安裝庫

這是另一種方式。 搜索到的安裝庫的方式多數是:在桌面上winR鍵運行終端,輸入命令,安裝不了,發現安裝不了。 1、打開pycharm; 2、軟件下部的Terminal終端(需要運行一個代碼才能出現,任何代碼都可)&#xf…

Es、kibana安裝教程-ES(二)

上篇文章介紹了ES負責數據存儲,計算和搜索,他與傳統數據庫不同,是基于倒排索引來解決問題的。Kibana是es可視化工具。 分布式搜索ElasticSearch-ES(一) 一、ElasticSearch安裝 官網下載地址:https://www…

[C語言] 指針

1. 指針是什么 2. 指針和指針類型 3. 野指針 4. 指針運算 5. 指針和數組 6. 二級指針 7. 指針數組 目錄 1. 指針是什么? 2. 指針和指針類型 2.1 指針-整數 2.2 指針的解引用 3. 野指針 3.1 野指針成因 3.2 如何規避野指針 4. 指針運算 4.1 指針…

不用技術代碼,分班查詢系統怎么做?

暑假即將結束,新學期開始將面臨分班信息公布的工作!對于分班信息公布,涉及到學生的個人信息,包括姓名、學號、班級等。在發布這些信息時,必須確保數據的保密性,防止未經授權的人員獲取到學生的個人信息。因…

對字符串中所有單詞進行倒排-C語言/Java

描述 輸入一個字符串,輸出字符串中單詞的倒序。 要求 構成單詞的字符只有26個大寫或小寫英文字母。非構成單詞的字符均視為單詞間隔符;倒排后的單詞間隔符以一個空格表示;如果原字符串中相鄰單詞間有多個間隔符時,倒排轉換后也只…

docker的服務/容器缺少vim問題

背景/問題: docker的服務/容器缺少vim問題 bash: vim: command not found 在docker的mysql服務中安裝Vim 1、執行apt-get update root6d8d17e320a0:/# apt-get update問題:文件下載失敗 Err:1 http://security.debian.org/debian-security buster/updates InRe…

【Linux】程序地址空間

程序地址空間 首先引入地址空間的作用什么是地址空間為什么要有地址空間 首先引入地址空間的作用 1 #include <stdio.h>2 #include <unistd.h>3 #include <stdlib.h>4 int g_val 100;6 int main()7 {8 pid_t id fork();9 if(id 0)10 {11 int cn…

自動方向識別式 LSF型電平轉換芯片

大家好&#xff0c;這里是大話硬件。 今天這篇文章想分享一下電平轉換芯片相關的內容。 其實在之前的文章分享過一篇關于電平轉換芯片的相關內容&#xff0c;具體可以看鏈接《高速電路邏輯電平轉換設計》。當時這篇文章也是分析的電平轉換芯片&#xff0c;不過那時候更多的是…

矩陣的轉置

題目&#xff1a; 給你一個二維整數數組 matrix&#xff0c; 返回 matrix 的 轉置矩陣 。 示例 1&#xff1a; 輸入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 輸出&#xff1a;[[1,4,7],[2,5,8],[3,6,9]]class Solution(object):def transpose(self, matrix):"&q…

JMeter 的并發設置教程

JMeter 是一個功能強大的性能測試工具&#xff0c;可以模擬許多用戶同時訪問應用程序的情況。在使用 JMeter 進行性能測試時&#xff0c;設置并發是非常重要的。本文將介紹如何在 JMeter 中設置并發和查看報告。 設置并發 并發是在線程組下的線程屬性中設置的。 線程數&#…

3.解構賦值

解構賦值是一種快速為變量賦值的簡潔語法&#xff0c;本質上仍然是為變量賦值。 3.1數組解構 數組解構是 將數組的單元值快速批量賦值給一系列變量 的簡潔語法 1.基本語法: &#xff08;1&#xff09;賦值運算符左側的[ ]用于批量聲明變量&#xff0c;右側數組的單元值將被賦…

前后端分離------后端創建筆記(04)前后端對接

本文章轉載于【SpringBootVue】全網最簡單但實用的前后端分離項目實戰筆記 - 前端_大菜007的博客-CSDN博客 僅用于學習和討論&#xff0c;如有侵權請聯系 源碼&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…