【二叉樹進階題目】236. 二叉樹的最近公共祖先,JZ36 二叉搜索樹與雙向鏈表

二叉樹進階題目

  • 236. 二叉樹的最近公共祖先
    • 解題思路及實現
      • 思路一
      • 思路二
  • JZ36 二叉搜索樹與雙向鏈表
    • 描述
    • 解題思路及實現

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

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

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

示例
在這里插入圖片描述

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

在這里插入圖片描述

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

解題思路及實現

思路一

在這里插入圖片描述

class Solution {
public://中序遍歷的變形---->Findbool InOrder(TreeNode* root,TreeNode* node){if(root == nullptr)return false;if(root == node)return true;return InOrder(root->left,node) || InOrder(root->right,node);}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(root == nullptr)return nullptr;//p或q是根if(root == p || root == q)return root;//找p,找q, 注意p,q一定在樹中bool pInLeft=InOrder(root->left,p);bool pInRight=!pInLeft;bool qInLeft=InOrder(root->left,q);bool qInRight=!qInLeft;//判斷if((pInLeft && qInRight) || (pInRight && qInLeft))return root;else if(pInLeft && qInLeft)return lowestCommonAncestor(root->left,p,q);elsereturn lowestCommonAncestor(root->right,p,q);}
};

在這里插入圖片描述
雖然代碼沒問題,但是運行效率太差了。分析一下上面是什么原因導致的。
在這里插入圖片描述

如果這顆樹是一個二叉搜索樹,我們就不需要去子樹尋找了。
又或者這是一顆三叉樹。

在這里插入圖片描述

思路二

在這里插入圖片描述

class Solution {
public://DFS<----->前序遍歷//我們這里是回溯,回溯也是DFS,特點是往回走做一些事情//關于回溯,DFS,前序遍歷不要深究到底是什么有什么區別,其實都是遞歸bool GetPath(TreeNode* root,TreeNode* node,stack<TreeNode*>& st){if(root == nullptr)return false;st.push(root);if(root == node)return true;if(GetPath(root->left,node,st))return true;if(GetPath(root->right,node,st))return true;st.pop();return false;}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(root == nullptr)return nullptr;stack<TreeNode*> pst;stack<TreeNode*> qst;GetPath(root,p,pst);GetPath(root,q,qst);while(pst.size() != qst.size()){if(pst.size() > qst.size())pst.pop();elseqst.pop();}while(pst.top() != qst.top()){pst.pop();qst.pop();}return pst.top();}
};

JZ36 二叉搜索樹與雙向鏈表

JZ36 二叉搜索樹與雙向鏈表這是一道牛客上面的題。

描述

輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。如下圖所示
在這里插入圖片描述
數據范圍:輸入二叉樹的節點數0≤n≤1000,二叉樹中每個節點的值 0≤val≤1000
要求:空間復雜度O(1)(即在原樹上操作),時間復雜度 O(n)

注意:
1.要求不能創建任何新的結點,只能調整樹中結點指針的指向。當轉化完成以后,樹中節點的左指針需要指向前驅,樹中節點的右指針需要指向后繼
2.返回鏈表中的第一個節點的指針
3.函數返回的TreeNode,有左右指針,其實可以看成一個雙向鏈表的數據結構
4.你不用輸出雙向鏈表,程序會根據你的返回值自動打印輸出

解題思路及實現

在這里插入圖片描述

class Solution {
public://prev必須加個引用,不然等到遞歸返回上一層的時候//明明prev=cur了,但是返回到上一層prev還是nullptrvoid ConvertLink(TreeNode* cur,TreeNode*& prev){	if(cur == nullptr)return;ConvertLink(cur->left, prev);cur->left=prev;if(prev)prev->right=cur;prev=cur;ConvertLink(cur->right, prev);}TreeNode* Convert(TreeNode* pRootOfTree) {if(pRootOfTree == nullptr)return nullptr;TreeNode* prev=nullptr;ConvertLink(pRootOfTree,prev);//找鏈表頭,鏈接之后,pRootOfTree還在while(pRootOfTree->left)pRootOfTree=pRootOfTree->left;return pRootOfTree;}
};

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

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

相關文章

Axios 攔截器 請求攔截器 響應攔截器

請求攔截器 相當于一個關卡&#xff0c;如果滿足條件就放行請求&#xff0c;不滿足就攔截 響應攔截器 在處理結果之前&#xff0c;先對結果進行預處理&#xff0c;比如&#xff1a;對數據進行一下格式化的處理 全局請求攔截器 axios.interceptors.request.use(config > { /…

SeaTunnel及SeaTunnel Web部署指南(小白版)

現在你能搜索到的SeaTunnel的安裝。部署基本都有坑&#xff0c;官網的文檔也是見到到相當于沒有&#xff0c;基本很難找到一個適合新手小白第一次上手就能成功安裝部署的版本&#xff0c;于是就有了這個部署指南的分享&#xff0c;小主已經把可能遇到的坑都填過了&#xff0c;希…

Web前端—移動Web第五天(媒體查詢、Bootstrap、綜合案例-alloyTeam)

版本說明 當前版本號[20231122]。 版本修改說明20231122初版 目錄 文章目錄 版本說明目錄移動 Web 第五天01-媒體查詢基本寫法書寫順序案例-左側隱藏媒體查詢-完整寫法關鍵詞 / 邏輯操作符媒體類型媒體特性 媒體查詢-外部CSS 02-Bootstrap簡介使用步驟下載使用 柵格系統全局…

PTA 六度空間

“六度空間”理論又稱作“六度分隔&#xff08;Six Degrees of Separation&#xff09;”理論。這個理論可以通俗地闡述為&#xff1a;“你和任何一個陌生人之間所間隔的人不會超過六個&#xff0c;也就是說&#xff0c;最多通過五個人你就能夠認識任何一個陌生人。”如圖1所示…

大白話DDD(DDD黑話終結者)

大白話DDD&#xff08;DDD黑話終結者&#xff09; 一、吐槽的話 相信聽過DDD的人有很大一部分都不知道這玩意具體是干嘛的&#xff0c;甚至覺得它有那么一些虛無縹緲。原因之一是但凡講DDD的&#xff0c;都是一堆特別高大上的概念&#xff0c;然后冠之以一堆讓人看不懂的解釋…

Python教程73:Pandas中一維數組Series學習

創建一維數據類型Series dataNone 要轉化為Series的數據(也可用dict直接設置行索引) 若是標量則必須設置索引,該值會重復,來匹配索引的長度 indexNone 設置行索引 dtypeNone 設置數據類型(使用numpy數據類型) nameNone 設置Series的name屬性 copyFalse 不復制 (當data為ndarray…

Centos中的解壓和壓縮指令

在CentOS 7系統中&#xff0c;可以使用多種命令進行文件壓縮和解壓縮操作。以下是常見的文件壓縮和解壓命令及其用法的詳解&#xff1a; 1.tar&#xff1a;tar命令用于打包文件或目錄&#xff0c;并可選地壓縮為tar壓縮包。 創建tar壓縮包&#xff1a;tar -cvf archive.tar f…

【深度學習】神經網絡術語:Epoch、Batch Size和迭代

batchsize&#xff1a;中文翻譯為批大小&#xff08;批尺寸&#xff09;。 簡單點說&#xff0c;批量大小將決定我們一次訓練的樣本數目。 batch_size將影響到模型的優化程度和速度。 為什么需要有 Batch_Size : batchsize 的正確選擇是為了在內存效率和內存容量之間尋找最…

Postgresql源碼(116)提升子查詢案例分析

0 總結 對于SQL&#xff1a;select * from student, (select * from score where sno > 2) s where student.sno s.sno; pullup在pull_up_subqueries函數內遞歸完成&#xff0c;分幾步&#xff1a; 將內層rte score追加到上層rtbable中&#xff1a;rte1是student、rte2帶…

nginx編譯安裝

1.下載nginx&#xff1a; 地址&#xff1a;http://nginx.org/en/download.html 2.安裝依賴 安裝gcc: yum install -y gcc安裝pcre庫 yum install -y pcre pcre-devel安裝zlib庫&#xff1a; yum install -y zlib zlib-devel3.安裝nginx ./configure --prefix/usr/local/ngi…

Spark SQL將Hive表中的數據寫入到MySQL數據庫中

import org.apache.spark.sql.SparkSessionobject HiveToMySQL {def main(args: Array[String]): Unit {// 創建SparkSessionval spark SparkSession.builder().appName("HiveToMySQL").enableHiveSupport().getOrCreate()// 讀取Hive表數據val hiveDF spark.tabl…

一體化大氣環境監測設備實時守護我們的空氣質量

WX-CSQX12 隨著空氣污染問題的日益嚴重&#xff0c;大氣環境監測設備成為了我們生活中不可或缺的一部分。而一體化的大氣環境監測設備&#xff0c;更是為我們的環境保護工作帶來了更多的便利和效益。 一體化大氣環境監測設備是一種集成了多種功能于一體的環保設備&#xff0c;…

BootStrap【表格二、基礎表單、被支持的控件、表單狀態】(二)-全面詳解(學習總結---從入門到深化)

目錄 表格二 表單_基礎表單 表單_被支持的控件 表單_表單狀態 表格二 緊縮表格 通過添加 .table-condensed 類可以讓表格更加緊湊&#xff0c;單元格中的內補&#xff08;padding&#xff09;均會減半 <table class"table table-condensed table-bordered"…

學習量化交易如何入門?

Python 量化入門很簡單&#xff0c;只需 3 步就能快速上手! 題主在程序方向沒有相關經驗&#xff0c;今天就從量化行業的通用語言-Python 著手&#xff0c;教大家如何快速入門。 一、準備工作 在開始 Python 編程之前&#xff0c;首先需要確保你的計算機上安裝了合適的 Pytho…

【深度學習】Transformer簡介

近年來&#xff0c;Transformer模型在自然語言處理&#xff08;NLP&#xff09;領域中橫掃千軍&#xff0c;以BERT、GPT為代表的模型屢屢屠榜&#xff0c;目前已經成為了該領域的標準模型。同時&#xff0c;在計算機視覺等領域中&#xff0c;Transformer模型也逐漸得到了重視&a…

【PythonGIS】基于Python面矢量轉換線矢量

今天有些不一樣&#xff0c;發這篇文章并不是項目需要。單純的想到有這個功能沒使用Python實現&#xff0c;所以就去研究了一下&#xff0c;第一時間就和大家分享。如何使用Python的osgeo庫實現面矢量數據與線矢量數據的互相轉換。 一、導入所需庫 import os from osgeo impor…

論文速讀《DeepFusion: Lidar-Camera Deep Fusion for Multi-Modal 3D Object Detection》

概括主要內容 文章《DeepFusion: Lidar-Camera Deep Fusion for Multi-Modal 3D Object Detection》提出了兩種創新技術&#xff0c;以改善多模態3D檢測模型的性能&#xff0c;通過更有效地融合相機和激光雷達傳感器數據來提高對象檢測的準確性&#xff0c;尤其是在行人檢測方面…

自動化提交git

1.前要 這里只是講解如何在Windows上創建自動化腳本/程序來達到自動pull、commit、push&#xff0c;減少冗余的倉庫更新工作&#xff0c;避免在多平臺下合作造成版本沖突等。 2.原理 使用Windows下默認的cmd/bat腳本編寫代碼。 只需要在網絡上查詢一些相關的語法&#xff0…

2023亞太杯數學建模C題思路 - 我國新能源電動汽車的發展趨勢

1 賽題 問題C 我國新能源電動汽車的發展趨勢 新能源汽車是指以先進技術原理、新技術、新結構的非常規汽車燃料為動力來源( 非常規汽車燃料指汽油、柴油以外的燃料&#xff09;&#xff0c;將先進技術進行汽車動力控制和驅動相結 合的汽車。新能源汽車主要包括四種類型&#x…

【計算思維】藍橋杯STEMA 科技素養考試真題及解析 6

1、明明買了一個掃地機器人&#xff0c;可以通過以下指令控制機器人運動: F:向前走 10 個單位長度 L:原地左轉 90 度 R:原地右轉 90 度 機器人初始方向向右&#xff0c;需要按順序執行以下那條指令&#xff0c;才能打掃完下圖中的道路 A、F-L-F-R-F-F-R-F-L-F B、F-R-F-L-F-F…