【Leetcode 熱題 100】236. 二叉樹的最近公共祖先

問題背景

給定一個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。
最近公共祖先的定義為:對于有根樹 T T T 的兩個節點 p p p q q q,最近公共祖先表示為一個節點 x x x,滿足 x x x p p p q q q 的祖先且 x x x 的深度盡可能大(一個節點也可以是它自己的祖先)。

數據約束

  • 樹中節點數目在范圍 [ 2 , 1 0 5 ] [2, 10 ^ 5] [2,105] 內。
  • ? 1 0 9 ≤ N o d e . v a l ≤ 1 0 9 -10 ^ 9 \le Node.val \le 10 ^ 9 ?109Node.val109
  • 所有 N o d e . v a l Node.val Node.val 互不相同 。
  • p ≤ q p \le q pq
  • p p p q q q 均存在于給定的二叉樹中。

解題過程

首先要想明白一種情形,如果遞歸到某個節點,發現題中所要求的兩個節點分別在這個節點的兩棵子樹中,那么它就是答案,由兩個條件保證:

  • 這個節點以上(往根節點的方向)的節點,不管是不是公共祖先,都一定不滿足 最近 這個要求。
  • 這個節點以下(往子樹的方向)的節點,必然不滿足同時是兩棵子樹的根節點,但是要求的兩個節點分別在兩棵子樹上。這就意味著,這些節點都不可能成為公共祖先。

在此基礎上,如果當前節點是題中要求的其中某一個節點,那么它就是答案。
剩下的情況,遇到空節點返回空是常規此操作;遞歸的過程中只在左右子樹上找到相應的節點,那就只返回遞歸相應子樹的結果;如果在子樹上都沒有找到,同樣返回空。

具體實現

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {// 當前節點是空節點則返回空,可與找到一個要求的節點合并if(root == null || root == p || root == q) {return root;}// 遞歸到左右子樹中繼續查找TreeNode left = lowestCommonAncestor(root.left, p, q);TreeNode right = lowestCommonAncestor(root.right, p, q);// 在左子樹或者右子樹中都找到了相應的節點,那么就把當前節點向上返回if(left != null && right != null) {return root;}// 返回遞歸子樹時得到的非空的結果,兩者都為空時隨便返回哪個都可以,合并到 right 中return left != null ? left : right;}
}

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

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

相關文章

數據結構--堆的向上調整和向下調整

文章目錄 1.完全二叉樹2.堆向上調整3.堆向下調整4.測試代碼 1.完全二叉樹 下面的這個就是對于我們的完全二叉樹的這個邏輯結構和物理結構的說明: 邏輯結構就是我們自己認為的進行購想出來的; 但是這個物理結構卻是我們的這個數據結構在內存里面的真是…

智能掛號系統設計典范:SSM 結合 Vue 在醫院的應用實現

摘要 隨著信息技術在管理上越來越深入而廣泛的應用,管理信息系統的實施在技術上已逐步成熟。本文介紹了醫院預約掛號系統的開發全過程。通過分析醫院預約掛號系統管理的不足,創建了一個計算機管理醫院預約掛號系統的方案。文章介紹了醫院預約掛號系統的系…

“魔法糖果盒的秘密:用樸素貝葉斯算法猜糖果顏色”

想象一下,你有一個神奇的糖果盒,這個糖果盒里有兩種糖果:紅色的和藍色的。你閉上眼睛,從盒子里拿出一個糖果,然后嘗一嘗,你想知道這個糖果是紅色的還是藍色的。樸素貝葉斯算法就像是一個魔法規則&#xff0…

Transform組件的用法

文章目錄 1. 概念介紹2. 使用方法3. 示例代碼我們在上一章回中介紹了Checkbox Widget相關的內容,本章回中將介紹Transform Widget.閑話休提,讓我們一起Talk Flutter吧。 1. 概念介紹 我們在這里說的Transform是一種容器類widget,它和Container組件類似。它可以包含其它的組件…

go面試問題

1 Go的內存逃逸如何分析 go build -gcflags-m main_pointer.go 2 http狀態碼 300 請求的資源可包括多個位置,相應可返回一個資源特征與地址的列表用于用戶終端(例如:瀏覽器)選擇 301 永久移動。請求的資源已被永久的移動到新U…

康冠科技嵌入式面試題及參考答案

LCD 驅動你自己做了哪些內容? 在 LCD 驅動開發中,首先是硬件層面的理解。需要仔細研究 LCD 的數據手冊,明確其引腳定義,包括電源引腳、數據引腳、控制引腳等。比如,對于常見的 RGB 接口 LCD,要清楚哪幾個引腳是用于傳輸紅、綠、藍三種顏色的數據,以及像 VSYNC(垂直同步…

TouchGFX移植(5)增加觸屏驅動

一)增加驅動代碼gt9xxx.c和ctiic.c到工程中的BSP目錄下: 二)更改觸摸文件STM32TouchController.cpp 1)在STM32TouchController.cpp文件中增加: #include “gt9xxx.h” 2)增加gt9xxx_init(); void STM32TouchControlle…

初識面向對象晨考day09

1.類和對象什么關系 類是對象的抽象 對象是類的具體 2.什么是屬性和方法 一類事物共有的特征,使用屬性描述 一類事物共有的行為,使用方法描述 3.普通方法的定義格式 public 返回值類型 方法名(參數列表){} 4.什么是形參,什么是實參 形參是方法…

資源型數字化平臺該如何順利運營?

一、引言 隨著信息技術的迅猛發展,資源型數字化平臺在各領域的重要性日益凸顯。此類平臺整合各類資源,以數字化手段提升資源利用效率與價值,但確保其順利運營面臨諸多挑戰。 二、資源型數字化平臺特點 資源型數字化平臺具有資源整合性&…

GitLab的安裝和使用

1.GitLab 環境說明 系統版本 CentOS 7.2 x86_64 軟件版本 gitlab-ce-10.8.4 GitLab 是一個用于倉庫管理系統的開源項目,使用Git作為代碼管理工具,并在此基礎上搭建起來的web服務。可通過Web界面進行訪問公開的或者私人項目。它擁有與Github類似的功能…

Leetcode 串聯所有單詞的子串

算法思想(中文解釋) 這道題目要求我們在字符串 s 中找到所有子串,這些子串是字符串數組 words 中所有單詞的串聯,并且每個單詞只能使用一次,且順序可以任意。下面是代碼的算法思想: 1. 核心思路 分解問題…

解析在OceanBase創建分區的常見問題|OceanBase 用戶問題精粹

在《分區策略和管理分區計劃的實踐方案》這篇文章中,我們介紹了在ODC中制定分區策略及有效管理分區計劃的經驗。有不少用戶在該帖下提出了使用中的問題,其中一個關于創建分區的限制條件的問題,也是很多用戶遭遇的老問題。因此本文以其為切入&…

有哪些免費的 ERP 軟件可供選擇?哪些 ERP 軟件使用體驗較好?

想找個 “免費” 的 ERP 軟件? 咱得知道,ERP 那可是涉及財務、人力、供應鏈、采購、銷售等好多方面的重要企業軟件。功能這么全,能免費才怪呢!真要是有免費的,早就火遍大江南北,說不定把市場都壟斷了&…

centos-stream9系統安裝docker

如果之前安裝過docker需要刪除之前的。 sudo dnf -y remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 安裝yum-utils工具: dnf -y install yum-utils dnf-plugin…

了解cuda的統一內存

1. CUDA 6中的統一內存 在CUDA 6中,從Kepler GPU架構(計算能力3.0或更高)開始,在64位Windows 7、8和Linux操作系統(內核2.6.18)上開始支持統一內存. 從CUDA 6開始,NVIDIA推出了CUDA平臺歷史上…

unity 最小后監聽鍵盤輸入

當Untiy最小化后,游戲窗口不會立刻失去焦點,此時依然可以使用Input來獲取按鍵,但是點擊其他窗口后,就會失去焦點,此時系統會把按鍵輸入分配到其他窗口里,此時要用windowsAPI獲取按鍵輸入,應對兩…

Pytorch | 從零構建MobileNet對CIFAR10進行分類

Pytorch | 從零構建MobileNet對CIFAR10進行分類 CIFAR10數據集MobileNet設計理念網絡結構技術優勢應用領域 MobileNet結構代碼詳解結構代碼代碼詳解DepthwiseSeparableConv 類初始化方法前向傳播 forward 方法 MobileNet 類初始化方法前向傳播 forward 方法 訓練過程和測試結果…

Electronjs+Vue如何開發PC桌面客戶端(Windows,Mac,Linux)

electronjs官網 https://www.electronjs.org/zh/ Electron開發PC桌面客戶端的技術選型非常適合已經有web前端開發人員的團隊。能夠很絲滑的過渡。 Electron是什么? Electron是一個使用 JavaScript、HTML 和 CSS 構建桌面應用程序的框架。 嵌入 Chromium 和 Node.…

【1.排序】

排序 筆記記錄 1.排序的基本概念1.1 排序的定義 2. 插入排序2.1 直接插入排序2.2 折半插入排序2.3 希爾排序 3. 交換排序3.1 冒泡排序3.2 快速排序 4. 選擇排序4.1 簡單選擇排序4.2 堆排序 5. 歸并排序、基數排序和計數排序5.1 歸并排序4.2 基數排序4.3 計數排序 6. 各種內部排…

Linux Swap: 深入解析 mkswap, mkfs.swap, 和 swapon

文章目錄 Linux Swap: 深入解析 mkswap, mkfs.swap, 和 swapon什么是 Swap?主要命令介紹1. mkswap2. mkfs.swap3. swapon 創建和管理 Swap 的步驟1. 創建 Swap 分區2. 初始化 Swap3. 激活 Swap4. 持久化配置5. 查看 Swap 狀態 刪除 Swap 分區或文件1. 停用 Swap2. 刪…