代碼隨想錄第17天:二叉樹

一、二叉搜索樹的最近公共祖先(Leetcode 235)

由于是二叉搜索樹,節點的值有嚴格的順序關系:左子樹的節點值都小于父節點,右子樹的節點值都大于父節點。利用這一點,可以在樹中更高效地找到最低公共祖先。

class Solution:def traversal(self, cur, p, q):# 遞歸的基本情況:當前節點為空,返回 Noneif cur is None:return cur# 如果當前節點的值大于 p 和 q 的值,說明 p 和 q 都在左子樹中if cur.val > p.val and cur.val > q.val:  # 左left = self.traversal(cur.left, p, q)  # 在左子樹中遞歸查找if left is not None:return left  # 如果左子樹中找到了節點,返回該節點# 如果當前節點的值小于 p 和 q 的值,說明 p 和 q 都在右子樹中if cur.val < p.val and cur.val < q.val:  # 右right = self.traversal(cur.right, p, q)  # 在右子樹中遞歸查找if right is not None:return right  # 如果右子樹中找到了節點,返回該節點# 如果左右子樹都不為空,說明 p 和 q 分別在左右子樹中return cur  # 返回當前節點,因為當前節點就是它們的最低公共祖先def lowestCommonAncestor(self, root, p, q):return self.traversal(root, p, q)  # 從根節點開始查找 p 和 q 的最低公共祖先

二、二叉搜索樹中的插入操作(Leetcode 701)

如果要插入的值小于當前節點的值,應該插入到左子樹;如果要插入的值大于當前節點的值,應該插入到右子樹。

class Solution:# 插入值 val 到二叉搜索樹中def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:# 如果當前節點為空,創建一個新的節點并返回if root is None or root.val == val:return TreeNode(val)  # 創建一個新的 TreeNode 節點,包含插入的值# 如果當前節點值大于 val,則應該將 val 插入到左子樹elif root.val > val:# 如果左子樹為空,直接插入該值作為左子節點if root.left is None:root.left = TreeNode(val)  # 創建一個新的節點,并賦值給左子節點else:# 如果左子樹不為空,遞歸地在左子樹中插入 valself.insertIntoBST(root.left, val)# 如果當前節點值小于 val,則應該將 val 插入到右子樹elif root.val < val:# 如果右子樹為空,直接插入該值作為右子節點if root.right is None:root.right = TreeNode(val)  # 創建一個新的節點,并賦值給右子節點else:# 如果右子樹不為空,遞歸地在右子樹中插入 valself.insertIntoBST(root.right, val)# 返回根節點,確保樹的結構未被破壞return root

三、刪除二叉搜索樹中的節點(Leetcode 450)

刪除節點的三種情況:

1、節點沒有子節點(葉子節點):如果節點沒有左子樹也沒有右子樹(即葉子節點),直接刪除該節點,返回 None,表示當前節點被刪除。

2、節點只有右子樹:如果節點沒有左子樹(root.left is None),那么可以用右子樹代替當前節點。刪除該節點并返回右子節點,實際上是把右子樹提升為當前節點的子樹。

3、節點只有左子樹:如果節點沒有右子樹(root.right is None),那么可以用左子樹代替當前節點。刪除該節點并返回左子節點,實際上是把左子樹提升為當前節點的子樹。

4、節點有兩個子樹:從當前節點的右子樹開始,遞歸找到右子樹中最左的節點(cur.left is None),該節點就是右子樹中的最小節點。將該最小節點的左子樹指向當前節點的左子樹。

返回右子樹作為新樹的根節點(也就是當前節點被刪除,右子樹的最小節點替代了它的位置)。

class Solution:# 刪除二叉搜索樹中的節點def deleteNode(self, root, key):# 如果當前節點為空,返回空# 表示沒有找到節點或到達樹的末端if root is None:return root# 如果當前節點的值等于要刪除的值if root.val == key:# 如果節點沒有子節點(葉子節點),直接刪除該節點if root.left is None and root.right is None:return None# 如果節點只有右子樹,直接返回右子樹,刪除當前節點elif root.left is None:return root.right# 如果節點只有左子樹,直接返回左子樹,刪除當前節點elif root.right is None:return root.left# 如果節點有兩個子樹,找到右子樹中的最小節點(左子樹的最左節點)else:cur = root.right  # 從右子樹開始# 尋找右子樹中最小的節點(左子樹最深的節點)while cur.left is not None:cur = cur.left# 將右子樹最小節點的左子樹指向當前節點的左子樹cur.left = root.left# 返回右子樹作為新的根節點,替代當前節點return root.right# 如果當前節點的值大于要刪除的值,遞歸到左子樹中刪除if root.val > key:root.left = self.deleteNode(root.left, key)# 如果當前節點的值小于要刪除的值,遞歸到右子樹中刪除if root.val < key:root.right = self.deleteNode(root.right, key)# 返回根節點,確保樹的結構未被破壞return root

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

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

相關文章

C++中string庫常用函數超詳細解析與深度實踐

目錄 一、引言 二、基礎準備&#xff1a;頭文件與命名空間 三、string對象的創建與初始化(基礎&#xff09; 3.1 直接初始化 3.2 動態初始化&#xff08;空字符串&#xff09; 3.3 基于字符數組初始化 3.4 重復字符初始化 四、核心函數詳解 4.1 字符串長度相關 4.1.1 …

LanDiff:賦能視頻創作,語言與擴散模型的融合力量

自從 Wan 2.1 發布以來&#xff0c;AI 視頻生成領域似乎進入了一個發展瓶頸期&#xff0c;但這也讓人隱隱感到&#xff1a;“DeepSeek 時刻”即將到來&#xff01;就在前幾天&#xff0c;浙江大學與月之暗面聯合推出了一款全新的文本到視頻&#xff08;T2V&#xff09;生成模型…

【本地圖床搭建】寶塔+Docker+MinIO+PicGo+cpolar:打造本地化“黑科技”圖床方案

寫在前面&#xff1a;本博客僅作記錄學習之用&#xff0c;部分圖片來自網絡&#xff0c;如需引用請注明出處&#xff0c;同時如有侵犯您的權益&#xff0c;請聯系刪除&#xff01; 文章目錄 前言寶塔安裝DockerMinIO 安裝與設置cploar內網穿透PicGo下載與安裝typora安裝總結互動…

centos-LLM-生物信息-BioGPT-使用1

參考&#xff1a; GitHub - microsoft/BioGPT https://github.com/microsoft/BioGPT BioGPT&#xff1a;用于生物醫學文本生成和挖掘的生成式預訓練轉換器 |生物信息學簡報 |牛津學術 — BioGPT: generative pre-trained transformer for biomedical text generation and mini…

高效爬蟲:一文掌握 Crawlee 的詳細使用(web高效抓取和瀏覽器自動化庫)

更多內容請見: 爬蟲和逆向教程-專欄介紹和目錄 文章目錄 一、Crawlee概述1.1 Crawlee介紹1.2 為什么 Crawlee 是網頁抓取和爬取的首選?1.3 為什么使用 Crawlee 而不是 Scrapy1.4 Crawlee的安裝二、Crawlee的基本使用2.1 BeautifulSoupCrawler的使用方式2.2 ParselCrawler的使…

架構總覽怎么寫,才算工業級?

??系統架構文檔是整個項目最重要的起點,但很多人第一章就“寫穿了”: 不是寫得太細,就是沒有重點。想要寫出高質量、能協作、能傳承的架構文檔,這一篇會告訴你應該怎么做—— ? 架構總覽的終極目標 明確邊界、定義角色、畫清數據流 別講執行細節,別深入函數調用。 ? 架…

優先級隊列(堆二叉樹)底層的實現:

我們繼續來看我們的優先級隊列&#xff1a; 優先級隊列我們說過&#xff0c;他也是一個容器適配器&#xff0c;要依賴我們的容器來存儲數據&#xff1b; 他的第二個參數就是我們的容器&#xff0c;這個容器的默認的缺省值是vector&#xff0c;然后他的第三個參數&#xff0c;我…

GIC驅動程序分析

今天呢&#xff0c;我們就來具體的講一下GIC的驅動源碼啦&#xff0c;這個才是重點來著&#xff0c;我們來看看&#xff1a; GIC中的重要函數和結構體&#xff1a; 沿著中斷的處理流程&#xff0c;GIC涉及這4個重要部分&#xff1a; CPU從異常向量表中調用handle_arch_irq&am…

java操作redis庫,開箱即用

application.yml spring:application:name: demo#Redis相關配置redis:data:# 地址host: localhost# 端口&#xff0c;默認為6379port: 6379# 數據庫索引database: 0# 密碼password:# 連接超時時間timeout: 10slettuce:pool:# 連接池中的最小空閑連接min-idle: 0# 連接池中的最…

Cribl 通過Splunk search collector 來收集數據

今天利用Spliunk search collector 來收集數據啦:還是要先cribl 的官方文檔: Splunk Search Collector | Cribl Docs Splunk Search Collector Cribl Stream supports collecting search results from Splunk queries. The queries can be both simple and complex, as well a…

What Was the “Game Genie“ Cheat Device, and How Did It Work?

什么是“Game Genie”作弊裝置&#xff0c;它是如何工作的&#xff1f; First released in 1991, the Game Genie let players enter special codes that made video games easier or unlocked other functions. Nintendo didnt like it, but many gamers loved it. Heres wha…

位運算題目:連接連續二進制數字

文章目錄 題目標題和出處難度題目描述要求示例數據范圍 解法思路和算法代碼復雜度分析 題目 標題和出處 標題&#xff1a;連接連續二進制數字 出處&#xff1a;1680. 連接連續二進制數字 難度 5 級 題目描述 要求 給定一個整數 n \texttt{n} n&#xff0c;將 1 \text…

第十六屆藍橋杯Java b組(試題C:電池分組)

問題描述&#xff1a; 輸入格式&#xff1a; 輸出格式&#xff1a; 樣例輸入&#xff1a; 2 3 1 2 3 4 1 2 3 4 樣例輸出: YES NO 說明/提示 評測用例規模與約定 對于 30% 的評測用例&#xff0c;1≤T≤10&#xff0c;2≤N≤100&#xff0c;1≤Ai?≤10^3。對于 100…

63. 評論日記

2025年4月14日18:53:30 雷軍這次是真的累了_嗶哩嗶哩_bilibili

電商中的訂單支付(內網穿透)

支付頁面 接口文檔 Operation(summary"獲取訂單信息") GetMapping("auth/{orderId}") public Reuslt<OrderInfo> getOrderInfo(Parameter(name"orderId",description"訂單id",requiredtrue) PathVaariable Long orderId){OrderI…

MySQL表的使用(4)

首先回顧一下之前所學的增刪查改&#xff0c;這些覆蓋了平時使用的80% 我們上節課中學習到了MySQL的約束 其中Primary key 是主鍵約束&#xff0c;我們今天要學習的是外鍵約束 插入一個表 外鍵約束 父表 子表 這條記錄中classid為5時候&#xff0c;不能插入&#xff1b; 刪除…

Kotlin作用域函數

在 Kotlin 中&#xff0c;.apply 是一個 作用域函數&#xff08;Scope Function&#xff09;&#xff0c;它允許你在一個對象的上下文中執行代碼塊&#xff0c;并返回該對象本身。它的設計目的是為了 對象初始化 或 鏈式調用 時保持代碼的簡潔性和可讀性。 // 不使用 apply va…

C#集合List<T>與HashSet<T>的區別

在C#中&#xff0c;List和HashSet都是用于存儲元素的集合&#xff0c;但它們在內部實現、用途、性能特性以及使用場景上存在一些關鍵區別。 內部實現 List&#xff1a;基于數組實現的&#xff0c;可以包含重復的元素&#xff0c;并且元素是按照添加的順序存儲的。 HashSet&…

Python 實現的運籌優化系統數學建模詳解(最大最小化模型)

一、引言 在數學建模的實際應用里&#xff0c;最大最小化模型是一種極為關鍵的優化模型。它的核心目標是找出一組決策變量&#xff0c;讓多個目標函數值里的最大值盡可能小。該模型在諸多領域&#xff0c;如資源分配、選址規劃等&#xff0c;都有廣泛的應用。本文將深入剖析最大…

數據庫的種類及常見類型

一&#xff0c;數據庫的種類 最常見的數據庫類型分為兩種&#xff0c;關系型數據庫和非關系型數據庫。 二&#xff0c;關系型數據庫介紹 生產環境主流的關系型數據庫有 Oracle、SQL Server、MySQL/MariaDB等。 關系型數據庫在存儲數據時實際就是采用的一張二維表&#xff0…