力扣236. 二叉樹的最近公共祖先(java DFS解法)

Problem: 236. 二叉樹的最近公共祖先

文章目錄

  • 題目描述
  • 思路
  • 解題方法
  • 復雜度
  • Code

題目描述

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

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

在這里插入圖片描述

思路

首先我們要注意到題目所給提示**二叉樹的所有節點值均不相等!!!**在此基礎上我們可以得到二叉樹的最近公共祖先唯一存在如下兩種情況:

1.若當前節點的左子樹和右子樹均存在給定節點的其一,則當前節點為最近公共祖先;
2.若當前節點等于所給節點的其中一個,同時當前節點的左子樹或者右子樹中存在所給節點的另一個節點,則當前節點為最近公共祖先

如下圖示:
image.png
image.png

解題方法

1.定義一個TreeNode類型的指針命名為location用于記錄并返回最后的最近公共祖先
2.遞歸后續遍歷二叉樹,記錄當前節點(包括當前節點)的左子樹或右子樹節點等于給定節點的個數
3.判斷當前節點是否等于給定節點中其一,同時其左右子樹中等于給定節點的個數(具體的判定條件看思路)判定成立時將指針location指向當前節點。
4.注意若在遞歸過程中發現指針location已經不為null則直接退出遞歸

復雜度

時間復雜度:

O ( n ) O(n) O(n)

空間復雜度:

O ( n ) O(n) O(n)

Code

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {//用于記錄指定節點最近的父節點位置private TreeNode location = null;/*** 求取二叉樹中指定兩節點的最近公共父節點(二叉樹任意節點值無重復)** @param root 樹的根節點* @param p    指定節點p* @param q    指定節點q* @return TreeNode*/public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {depthFirstSearch(root, p, q);return location;}/*** 深度優先(此處為二叉樹的后序遍歷)求取某一節點指定的* 節點p 與 q的個數,利用其找到最近父節點的位置* @param root 樹的根節點* @param p    指定節點p* @param q    指定節點q* @return int*/private int depthFirstSearch(TreeNode root, TreeNode p, TreeNode q) {if (root == null) {return 0;}//當前節點左子樹包含p,q節點的個數int leftContains = depthFirstSearch(root.left, p, q);//當已經找到location時提前退出if (location != null) {return 2;}//當前節點右子樹包含p,q節點的個數int rightContains = depthFirstSearch(root.right, p, q);if (location != null) {return 2;}//記錄當前節點值等于q或pint rootContain = 0;//如果當前節點值等于p,q其一if (root == p || root == q) {rootContain = 1;}/*找到情況1:當當前節點值等于p,q其一時,同時當前節點的左子樹或右子樹包含q,p的個數為1找到情況2:當當前節點的左子樹包含一個p或q其一,同時當前節點的右子樹包含一個q或p其一*/if (rootContain == 1 && (leftContains == 1 || rightContains == 1)) {location = root;}if (rootContain == 0 && leftContains == 1 && rightContains == 1) {location = root;}return leftContains + rightContains + rootContain;}
}

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

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

相關文章

Android逆向一-frida操作

系列文章目錄 第一章 frida操作 文章目錄 系列文章目錄前言一、兩種模式二、frida命令行執行及參數三、frida使用python執行四、動靜態域調用1. 靜態域調用2.動態域調用 五. 遠程rpc調用六. 補充總結 前言 熟悉frida操作,hook手機app的關鍵位置進行逆向操作 一、…

芯知識 | Flash可更換聲音語音芯片—引領音頻IC技術革新的新篇章

隨著科技的飛速發展,人們對于電子產品的音頻性能要求越來越高。在這種背景下,Flash可更換聲音語音芯片應運而生,成為音頻技術領域的一顆璀璨明星。本文將詳細介紹Flash可更換聲音語音芯片的特點、優勢以及應用場景,展望其在未來科…

【Docker】從零開始:10.registry搭建私有倉庫

【Docker】從零開始:10.registry搭建私有倉庫 為什么要使用私有倉庫關于Docker Registry基于容器搭建registry私有倉庫1.下載鏡像2. 啟動鏡像3.修改系統配置文件4.下載ubuntu鏡像,修改名稱3.提交鏡像4.查看鏡像 本地搭建私有倉庫(目前編譯報錯找不到包&a…

【管理運籌學】背誦手冊(五)| 動態規劃

五、動態規劃 基本概念 階段(Stage):將所給問題的過程,按時間或空間特征分解成若干相互聯系的階段,以便按次序去求解每階段的解,常用字母 k k k 表示。 狀態(State):…

java實現連接linux(上傳文件,執行shell命令等)

1 導入pom <dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version></dependency> 2 編寫配置類 package com.budwk.app.atest;import com.budwk.app.common.config.AppExceptio…

計算機網絡之網絡層

一、概述 主要任務是實現網絡互連&#xff0c;進而實現數據包在各網絡之間的傳輸 1.1網絡引入的目的 從7層結構上看&#xff0c;網絡層下是數據鏈路層 從4層結構上看&#xff0c;網絡層下面是網絡接口層 至少我們看到的網絡層下面是以太網 以太網解決了什么問題&#xff1f; 答…

【Python 千題 —— 基礎篇】刪除列表值

題目描述 題目描述 刪除列表的指定值。有一個列表 [1, 3, 5, 2, 44, 1, 9, 10, 32] &#xff0c;請使用 for 循環刪除該列表中與 [44, 1, 9] 列表相同的值&#xff0c;并輸出該列表。 輸入描述 無輸入。 輸出描述 輸出操作后的列表。 示例 示例 ① 輸出&#xff1a; …

記錄:通過day.js獲取兩個日期相差的時間,并轉化為年月日的格式

day.js這個日期庫真的是很不錯的日期庫&#xff0c;足夠滿足日常的開發需求。 Day.js中文網 (fenxianglu.cn) 需求&#xff1a;獲取兩個日期相差的時間&#xff0c;轉化為年月日的形式&#xff1b;話不多少&#xff0c;直接放代碼 import dayjs from "dayjs"; imp…

計算機網絡之應用層

一、概述 引入目的&#xff1a; 為了方便用戶去使用&#xff1b; 該如何方便用戶使用網絡呢&#xff0c;即怎樣幫助用戶使用網絡&#xff1f; 1.用戶需要知道網絡資源所在的位置 2.網絡上資源一定是在資源子網的主機上 3.資源子網上的主機&#xff0c;在通信子網中用IP地…

qt-C++筆記之終端Ctrl+C關閉界面和ROS節點

qt-C筆記之終端CtrlC關閉界面和ROS節點 code review! 文章目錄 qt-C筆記之終端CtrlC關閉界面和ROS節點1.運行2.main.cpp3.main_window.hpp 1.運行 2.main.cpp 3.main_window.hpp

vue-router 路由權限,路由導航守衛

addRouter() 添加路由 使用場景 列如&#xff1a;菜單權限的分配&#xff08;管理員與用戶不一致&#xff09; 根據后臺返回 參數 定義isAdmin根據isAdmin 分配 let isAdmin true // 添加路由 可以傳參 一級路由名稱 來添加二級路由 if (isAdmin) {router.addRoute({path: /…

SpringCloud 微服務全棧體系(十六)

第十一章 分布式搜索引擎 elasticsearch 六、DSL 查詢文檔 elasticsearch 的查詢依然是基于 JSON 風格的 DSL 來實現的。 1. DSL 查詢分類 Elasticsearch 提供了基于 JSON 的 DSL&#xff08;Domain Specific Language&#xff09;來定義查詢。常見的查詢類型包括&#xff1…

P1030 [NOIP2001 普及組] 求先序排列

1.先找根&#xff08;后序最后一個元素&#xff09; 2.以根分中序為兩個中序即&#xff1a; (相當于分為兩個子樹) A中序 對應->A后序 &#xff08;長度對應&#xff09; B中序 對應->B后序 &#xff08;長度對應&#xff09; 遞歸循壞即可&#xff08;中序長度小…

【數據結構(C語言)】淺談棧和隊列

目錄 文章目錄 前言 一、棧 1.1 棧的概念及結構 1.2 棧的實現 1.2.1. 支持動態增長的棧的結構 1.2.2 初始化棧 1.2.3 入棧 1.2.4 出棧 1.2.5 獲取棧頂元素 1.2.6 獲取棧中有效元素個數 1.2.7 檢查棧是否為空 1.2.8 銷毀棧 二、隊列 2.1 隊列的概念及結構 2.2 隊…

Javaweb之前后臺分離開發介紹的詳細解析

2.1 前后臺分離開發介紹 在之前的課程中&#xff0c;我們介紹過&#xff0c;前端開發有2種方式&#xff1a;前后臺混合開發和前后臺分離開發。 前后臺混合開發&#xff0c;顧名思義就是前臺后臺代碼混在一起開發&#xff0c;如下圖所示&#xff1a; 這種開發模式有如下缺點&a…

守護進程的理解

什么是守護進程 daemon False # 是否以守護進程方式運行&#xff0c;True守護&#xff0c;False 非守護 在這段代碼中&#xff0c;daemon 變量的值決定了進程是否以守護進程方式運行。如果 daemon 的值為 True&#xff0c;則表示進程將以守護進程方式運行&#xff0c;否則為…

使用vcpkg安裝庫失敗的解決方法

1、前言 vcpk是是一款開源的c/c庫管理工具&#xff0c;尤其是在windows平臺&#xff0c;可以幫助我們很好的管理各種依賴包。 在windows環境做c/c開發的人應該都深有體會&#xff0c;有時候編譯需要下載一堆依賴庫&#xff0c;導致搭建編譯環境特別麻煩。但是&#xff0c;通過v…

前端 vue 面試題(二)

文章目錄 如何讓vue頁面重新渲染組件間通信vue為什么要mutation、 action操作插槽、具名插槽、作用域插槽vue編譯使用的是什么庫&#xff1f;vue怎么實現treeshakingwebpack實現treeshaking為什么只有es module 能支持 tree shaking mixin 的作用mixin的底層原理nexTick原理vue…

預處理機制

跟著肯哥&#xff08;不是我&#xff09;學預處理機制 預處理類別 宏定義&#xff1a;#define 將文本替換為表達式或語句 條件編譯&#xff1a;#ifdef、#ifndef和#if、#elif、#endif 根據標識符是否被定義選擇編譯代碼 頭文件包含&#xff1a;#include 將其他文件&#x…

Jmeter怎么實現接口關聯?

用于接口測試時&#xff0c;后一個接口經常需要用到前一次接口返回的結果&#xff0c;應該如何獲取前一次請求的結果值&#xff0c;應用于后一個接口呢&#xff0c;拿一個登錄的例子來說明如何獲取。 1、打開jmeter&#xff0c;新建一個測試計劃&#xff0c;在測試計劃里新建一…