每日一道leetcode(回來了!!!)

236. 二叉樹的最近公共祖先 - 力扣(LeetCode)

題目

給定一個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。

百度百科中最近公共祖先的定義為:“對于有根樹 T 的兩個節點 p、q,最近公共祖先表示為一個節點 x,滿足 x 是 p、q 的祖先且 x 的深度盡可能大(一個節點也可以是它自己的祖先)。”

示例 1:

輸入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
輸出:3
解釋:節點 5 和節點 1 的最近公共祖先是節點 3 。

示例 2:

輸入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
輸出:5
解釋:節點 5 和節點 4 的最近公共祖先是節點 5 。因為根據定義最近公共祖先節點可以為節點本身。

示例 3:

輸入:root = [1,2], p = 1, q = 2
輸出:1

提示:

  • 樹中節點數目在范圍?[2, 105]?內。
  • -109 <= Node.val <= 109
  • 所有?Node.val?互不相同?。
  • p != q
  • p?和?q?均存在于給定的二叉樹中。

思路

  1. 首先定義一個全局結果節點,用于保存最早出現的滿足條件的祖先節點。
  2. 然后利用后序遍歷的深度優先搜索,保證最先找到的滿足條件的節點一定是深度最大的(即最低的/最靠近兩個目標節點的/最深的),因為都是先統計左右子樹在算根,所以對任意節點,若左右子樹有了,并賦給全局結果節點,那么該節點將不會更新,僅僅完成dfs的任務。

代碼實現

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:TreeNode* ans;int find_descendant(TreeNode* now, TreeNode* p, TreeNode* q) {int cnt = 0;if(now==p || now==q) {cnt++;}if(now->left) cnt += find_descendant(now->left, p, q);if(now->right) cnt += find_descendant(now->right, p, q);if(!ans && cnt==2) ans = now;return cnt;}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {ans = nullptr;int cnt = 0;if(root==p || root==q) cnt++;if(root->left) cnt += find_descendant(root->left, p, q);if(root->right) cnt += find_descendant(root->right, p, q);if(!ans && cnt==2) ans = root;return ans;}
};

復雜度分析

  • 時間復雜度:深度優先搜索只對每個節點進行一次遍歷,時間復雜度為O(n)。
  • 空間復雜度:空間復雜度取決于棧空間的大小,等價于樹的深度,最壞空間復雜度為O(n)(變成一條線的斜樹)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76870.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76870.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76870.shtml

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

相關文章

【Redis】布隆過濾器應對緩存穿透的go調用實現

布隆過濾器 https://pkg.go.dev/github.com/bits-and-blooms/bloom/v3 作用&#xff1a; 判斷一個元素是不是在集合中 工作原理&#xff1a; 一個位數組&#xff08;bit array&#xff09;&#xff0c;初始全為0。多個哈希函數&#xff0c;運算輸入&#xff0c;從而映射到位數…

【ROS2】行為樹 BehaviorTree(四):組合使用子樹

1、大樹調用子樹 如下圖,左邊為大樹主干: 1)如果門沒有關,直接通過; 2)如果門關閉了,執行開門動作,然后通過 右邊為子樹,主要任務是開門 1)嘗試直接開門; 2)嘗試開鎖開門,最多嘗試5次; 3)最后嘗試砸門! XML如何描述大樹主干調傭子樹:使用關鍵字 SubTree 來…

【口腔粘膜鱗狀細胞癌】文獻閱讀

寫在前面 看看文章&#xff0c;看看有沒有思路 文獻 The regulatory role of cancer stem cell marker gene CXCR4 in the growth and metastasis of gastric cancer IF:6.8 中科院分區:1區 醫學WOS分區: Q1 目的&#xff1a;通過 scRNA-seq 結合大量 RNA-seq 揭示癌癥干細胞…

【ComfyUI】藍耘元生代 | ComfyUI深度解析:高性能AI繪畫工作流實踐

【作者主頁】Francek Chen 【專欄介紹】 ? ? ?人工智能與大模型應用 ? ? ? 人工智能&#xff08;AI&#xff09;通過算法模擬人類智能&#xff0c;利用機器學習、深度學習等技術驅動醫療、金融等領域的智能化。大模型是千億參數的深度神經網絡&#xff08;如ChatGPT&…

深入理解Java中的隊列:核心操作、實現與應用

隊列&#xff08;Queue&#xff09;是計算機科學中最基礎且重要的數據結構之一&#xff0c;遵循 先進先出&#xff08;FIFO&#xff09; 的規則。Java通過java.util.Queue接口及其豐富的實現類為開發者提供了強大的隊列工具。本文將詳細解析Java隊列的核心操作、常見實現類及其…

idea里面不能運行 node 命令 cmd 里面可以運行咋回事啊

idea里面不能運行 node 命令 cmd 里面可以運行咋回事啊 在 IntelliJ IDEA&#xff08;或其他 JetBrains 系列 IDE&#xff09;中無法運行某些命令&#xff0c;但在系統的命令提示符&#xff08;CMD&#xff09;中可以正常運行&#xff0c;這種情況通常是由于以下原因之一導致的…

Express學習筆記(六)——前后端的身份認證

目錄 1. Web 開發模式 1.1 服務端渲染的 Web 開發模式 1.2 服務端渲染的優缺點 1.3 前后端分離的 Web 開發模式 1.4 前后端分離的優缺點 1.5 如何選擇 Web 開發模式 2. 身份認證 2.1 什么是身份認證 2.2 為什么需要身份認證 2.3 不同開發模式下的身份認證 3. Sessio…

微服務與Spring Cloud Alibaba簡介

微服務&#xff08;或微服務架構&#xff09;是一種云原生架構方法&#xff0c;其中單個應用程序由許多松散耦合且可獨立部署的較小組件或服務組成。本單元主要介紹微服務架構的定義、微服務的特征、微服務架構面臨的挑戰、Spring Cloud 定義、Spring Cloud 核心組件、Spring C…

JPG同步刪除RAW批處理文件

相機挑選JPG照片&#xff0c;同步刪除RAW格式文件&#xff0c;批處理文件bat&#xff0c;放到JPG和NEF文件夾根目錄 – NEF 文件夾 – JPG 文件夾 文件同步刪除.bat echo off:: 要同步的文件夾及文件后綴名&#xff08;相同&#xff09;&#xff0c;即要刪除文件的目錄 set de…

InnoDB的MVCC實現原理?MVCC如何實現不同事務隔離級別?MVCC優缺點?

概念 InnoDB的MVCC&#xff08;Multi-Version Concurrency Control&#xff09;即多版本并發控制&#xff0c;是一種用于處理并發事務的機制。它通過保存數據在不同時間點的多個版本&#xff0c;讓不同事務在同一時刻可以看到不同版本的數據&#xff0c;以此來減少鎖競爭&…

針對 Java從入門到精通 的完整學習路線圖、各階段技術點、CTO進階路徑以及經典書籍推薦。內容分階段展開,兼顧技術深度與職業發展

以下是針對 Java從入門到精通 的完整學習路線圖、各階段技術點、CTO進階路徑以及經典書籍推薦。內容分階段展開&#xff0c;兼顧技術深度與職業發展。 一、學習路線圖分階段詳解 階段1&#xff1a;Java基礎入門&#xff08;3-6個月&#xff09; 目標&#xff1a;掌握Java核心…

報錯:Nlopt

報錯&#xff1a;Nlopt CMake Error at TGH-Planner/fast_planner/bspline_opt/CMakeLists.txt:20 (find_package):By not providing "FindNLopt.cmake" in CMAKE_MODULE_PATH this project hasasked CMake to find a package configuration file provided by "…

鴻蒙公共通用組件封裝實戰指南:從基礎到進階

一、鴻蒙組件封裝核心原則 1.1 高內聚低耦合設計 在鴻蒙應用開發中&#xff0c;高內聚低耦合是組件封裝的關鍵準則&#xff0c;它能極大提升代碼的可維護性與復用性。 從原子化拆分的角度來看&#xff0c;我們要把復雜的 UI 界面拆分為基礎組件和復合組件。像按鈕、輸入框這…

Linux 網絡基礎二 ——應用層HTTP\HTTPS協議

我們程序員寫的一個個解決我們實際問題&#xff0c;滿足我們日常需求的網絡程序&#xff0c;都是在應用層。 前面寫的套接字接口都是傳輸層經過對 UDP 和 TCP 數據發送能力的包裝&#xff0c;以文件的形式呈現給我們&#xff0c;讓我們可以進行應用層編程。換而言之&#xff0c…

Spark-SQL

Spark-SQL 概述 Spark SQL 是 Spark 用于結構化數據(structured data)處理的 Spark 模塊 Shark 是伯克利實驗室 Spark 生態環境的組件之一&#xff0c;是基于 Hive 所開發的工具&#xff0c;它修改了內存管理、物理計劃、執行三個模塊&#xff0c;并使之能運行在 Spark 引擎上…

Java 在人工智能領域的突圍:從企業級架構到邊緣計算的技術革新

一、Java AI 的底層邏輯&#xff1a;從語言特性到生態重構 在 Python 占據 AI 開發主導地位的當下&#xff0c;Java 正通過技術重構實現突圍。作為擁有 30 年企業級開發經驗的編程語言&#xff0c;Java 的核心優勢在于強類型安全、內存管理能力和分布式系統支持&#xff0c;這…

編程實現除法程序時需要注意的細節

使用Python實現除法程序時&#xff0c;需注意以下關鍵細節&#xff1a; 除數為零的處理 必須檢查除數是否為零&#xff0c;否則會觸發ZeroDivisionError異常。可通過try-except結構捕獲異常并處理。 整數除法與浮點數除法的區別 ? 使用/運算符時&#xff0c;無論操作數是否為…

Java萬級并發場景-實戰解決

今天我們來做一個典型的消費力度能達到萬級別的并發場景&#xff0c;老師點名-學生簽到 正常情況 正常情況來說是不同班級下的老師發布不同的點名--然后不同班級下的很多學生同一時間進行簽到&#xff0c;簽到成功就去修改數據庫&#xff0c;簽到失敗就返回&#xff0c;但是這…

openGauss新特性 | 自動參數化執行計劃緩存

目錄 自動化參數執行計劃緩存簡介 SQL參數化及約束條件 一般常量參數化示例 總結 自動化參數執行計劃緩存簡介 執行計劃緩存用于減少執行計劃的生成次數。openGauss數據庫會緩存之前生成的執行計劃&#xff0c;以便在下次執行該SQL時直接使用&#xff0c;可…

計算機操作系統——存儲器管理

系列文章目錄 1.存儲器的層次結構 2.程序的裝入和鏈接 3.連續分配存儲管理方式&#xff08;內存夠用&#xff09; 4.對換&#xff08;Swapping&#xff09;(內存不夠用) 5.分頁存儲管理方式 6.分段存儲管理方式 文章目錄 系列文章目錄前言一、存儲器的存儲結構寄存器&…