二叉樹題解——驗證二叉搜索樹【LeetCode】后序遍歷

98. 驗證二叉搜索樹

一、算法邏輯(逐步通順講解每一步思路)

這段算法使用了一種遞歸的思路:
每個節點返回它所在子樹的 最小值和最大值,并在返回的過程中檢查 BST 的合法性。

? 1?? 定義遞歸函數 dfs(node),其含義是:
對于以 node 為根的子樹,返回其值域范圍 (最小值, 最大值)

? 2?? 處理空節點(遞歸邊界):
node is None 時,說明是空子樹,返回 (inf, -inf)

  • 空樹最大值是 -inf,最小值是 +inf,便于后續比較中不干擾當前節點的合法判斷。

? 3?? 分別遞歸左右子樹:

獲取當前節點左右子樹的最大/最小值。

? 4?? 當前節點合法性判斷(BST 核心條件):

  • 當前節點的值 x = node.val,必須滿足:

即:當前節點必須大于左子樹的最大值,小于右子樹的最小值。

如果不滿足,則立即返回非法標記 (?inf, +inf),用來“污染”父節點的判斷。

? 5?? 當前子樹的值域匯總:
如果合法,則當前子樹的最小值為 min(l_min, x),最大值為 max(r_max, x),向上傳遞。

? 6?? 最終檢查:
頂層返回的是根節點子樹的值域,如果合法,就不等于 (-inf, +inf);否則被污染為非法。


二、核心點總結

該算法的核心是:

后序遍歷地收集每棵子樹的最值信息,同時判斷當前節點是否滿足 BST 性質。

? 通過最小/最大值來傳遞合法性,思路獨特;
? 利用 (?inf, +inf) 作為非法標志,避免使用全局變量;
? 后序遍歷先處理左右子樹,再判斷當前節點,能做到“非法剪枝”;
? 可擴展性強:該模式也可以改寫為同時處理 AVL 樹、紅黑樹的平衡性檢測等。

class Solution:def isValidBST(self, root: Optional[TreeNode]) -> bool:def dfs(node: Optional[TreeNode]) -> Tuple:if node is None:return inf, -infl_min, l_max = dfs(node.left)r_min, r_max = dfs(node.right)x = node.val# 也可以在遞歸完左子樹之后立刻判斷,如果發現不是二叉搜索樹,就不用遞歸右子樹了if x <= l_max or x >= r_min:return -inf, infreturn min(l_min, x), max(r_max, x)return dfs(root)[1] != inf

三、時間復雜度分析

  • 每個節點都被訪問一次;

  • 每次訪問包含常數級操作(比較、返回值)。

所以時間復雜度為:

O(n),其中 n 是樹的節點數


四、空間復雜度分析

  • 主要是遞歸調用棧;

  • 最壞情況下是鏈狀結構,深度為 n

  • 最好是平衡樹,深度為 log n

所以空間復雜度為:

O(h),其中 h 是樹的高度,最壞為 O(n),平均為 O(log n)


? 總結一句話

本算法通過后序遍歷傳遞 (最小值, 最大值) 并在每一層校驗 BST 條件,以遞歸+返回值方式 elegantly 判斷整棵樹是否為 BST。其巧妙之處在于使用返回值同時傳遞判斷信息與范圍信息,無狀態、無額外全局變量、思路干凈優雅。

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

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

相關文章

Flink-Source算子點位提交問題(Earliest)

背景 最近在做 Flink 任務數據源切換時遇到 offset 消費問題&#xff0c;遂寫篇文章記錄下來。 切換時只修改了 source 算子的 topic&#xff0c;uid 等其他信息保持不變&#xff1a; 發布時&#xff0c;發現算子的消費者點位重置為earliest&#xff0c;導致消息積壓。消息積…

如何錄制帶備注的演示文稿(LaTex Beamer + Pympress)

參考文獻&#xff1a; Pympress 官網Avidemux 官網Audacity 官網FFmpeg 官網2025年度25大視頻剪輯軟件推薦2025最新音頻降噪軟件盤點&#xff0c;從入門到專業的6個高效工具如何用一段音頻替換mp4視頻格式的原有音頻&#xff1f;免費簡單易用的視頻剪切編輯工具—AvidemuxFFmp…

VS Code 的 Copilot Chat 擴展程序

安裝與啟用 Copilot Chat 擴展 在 VS Code 中打開擴展市場&#xff08;快捷鍵 CtrlShiftX 或點擊左側活動欄的擴展圖標&#xff09;。搜索“GitHub Copilot Chat”&#xff0c;點擊安裝。安裝完成后需登錄 GitHub 賬戶并授權 Copilot 權限。確保已訂閱 GitHub Copilot 服務&am…

bash 腳本比較 100 個程序運行時間,精確到毫秒,腳本

腳本如下&#xff1a; #!/bin/bash# 設置測試次數 NUM_TESTS100 # 設置要測試的程序路徑 PROGRAM"./your_program" # 替換為你的程序路徑 # 設置程序參數&#xff08;如果沒有參數則留空&#xff09; ARGS"" # 例如: "input.txt output.txt"#…

【Linux學習】Linux安裝并配置Redis

安裝Redis在Linux系統上安裝Redis可以通過包管理器或源碼編譯兩種方式進行。以下是兩種方法的詳細步驟。使用包管理器安裝Redis&#xff08;以Ubuntu為例&#xff09;&#xff1a;sudo apt update sudo apt install redis-server通過源碼編譯安裝Redis&#xff1a;wget https:/…

redis每種數據結構對應的底層數據結構原理

Redis 的每種數據結構(String、List、Hash、Set、Sorted Set)在底層都采用了不同的實現方式,根據數據規模和特性動態選擇最優的編碼(encoding)以節省內存和提高性能。以下是詳細原理分析: 1. String(字符串) 底層實現: int:當存儲整數值且可用 long 表示時,直接使用…

WPF控件大全:核心屬性詳解

WPF常用控件及核心屬性 以下是WPF開發中最常用的控件及其關鍵屬性&#xff08;按功能分類&#xff09;&#xff1a; 基礎布局控件 Grid&#xff08;網格布局&#xff09; RowDefinitions&#xff1a;行定義集合&#xff08;如Height"Auto"&#xff09;ColumnDefinit…

馬斯克腦機接口(Neuralink)技術進展,已經實現癱瘓患者通過BCI控制電腦、玩視頻游戲、學習編程,未來盲人也能恢復視力了

目錄 圖片總結文字版總結1. 核心目標與愿景1.1 增強人類能力1.2 解決腦部疾病1.3 理解意識1.4 應對AI風險 2. 技術進展與產品2.1 Telepathy&#xff08;意念操控&#xff09;功能與目標技術細節參與者案例 2.2 Blindsight&#xff08;視覺恢復&#xff09;**功能與目標**技術細…

Vuex身份認證

雖說上一節我們實現了登錄功能&#xff0c;但是實際上還是可以通過瀏覽器的地址來跳過登錄訪問到后臺&#xff0c;這種可有可無的登錄功能使得系統沒有安全性&#xff0c;而且沒有意義 為了讓登錄這個功能有意義&#xff0c;我們應該&#xff1a; 應當在用戶登錄成功之后給用戶…

springboot中使用線程池

1.什么場景下使用線程池&#xff1f; 在異步的場景下&#xff0c;可以使用線程池 不需要同步等待&#xff0c; 不需要管上一個方法是否執行完畢&#xff0c;你當前的方法就可以立即執行 我們來模擬一下&#xff0c;在一個方法里面執行3個子任務&#xff0c;不需要相互等待 …

Flask+LayUI開發手記(十):構建統一的選項集合服務

作為前端最主要的組件&#xff0c;無論是layui-table表格還是layui-form表單&#xff0c;其中都涉及到選項列的處理。如果是普通編程&#xff0c;一個任務對應一個程序&#xff0c;自然可以就事論事地單對單處理&#xff0c;前后端都配制好選項&#xff0c;手工保證兩者的一致性…

redis的數據初始化或增量更新的方法

做系統開發的時候&#xff0c;經常需要切換環境&#xff0c;做一些數據的初始化的工作&#xff0c;而redis的初始化&#xff0c;假如通過命令來執行&#xff0c;又太復雜&#xff0c;因為redis有很多種數據類型&#xff0c;全部通過敲擊命令來初始化的話&#xff0c;打的命令實…

【PaddleOCR】OCR表格識別數據集介紹,包含PubTabNet、好未來表格識別、WTW中文場景表格等數據,持續更新中......

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

sparkjar任務運行

mainclass&#xff1a; test.sparkjar.SparkJarTest

Web攻防-文件下載文件讀取文件刪除目錄遍歷路徑穿越

知識點&#xff1a; 1、WEB攻防-文件下載&讀取&刪除-功能點&URL 2、WEB攻防-目錄遍歷&穿越-功能點&URL 黑盒分析&#xff1a; 1、功能點 文件上傳&#xff0c;文件下載&#xff0c;文件刪除&#xff0c;文件管理器等地方 2、URL特征 文件名&#xff1a; d…

使用LIMIT + OFFSET 分頁時,數據重復的風險

在使用 LIMIT OFFSET 分頁時&#xff0c;數據重復的風險不僅與排序字段的唯一性有關&#xff0c;還與數據變動&#xff08;插入、刪除、更新&#xff09;密切相關。以下是詳細分析&#xff1a; 一、數據變動如何導致分頁異常 1. 插入新數據 場景&#xff1a;用戶在瀏覽第 1 頁…

Excel 數據透視表不夠用時,如何處理來自多個數據源的數據?

當數據透視表感到“吃力”時&#xff0c;我們該怎么辦&#xff1a; 數據量巨大&#xff1a;Excel工作表有104萬行的限制&#xff0c;當有幾十萬行數據時&#xff0c;透視表和公式就會變得非常卡頓。數據來源多樣&#xff1a;數據分散在多個Excel文件、CSV文件、數據庫甚至網頁…

cf(1034)Div3(補題A B C D E F)

哈&#xff0c;這個比賽在開了不久之后&#xff0c;不知道為啥卡了差不多20來分鐘&#xff0c;后面卡著卡著就想睡覺了。實在是太困了.... 題目意思&#xff1a; Alice做一次操作&#xff0c;刪除任意數字a,而Bob做一次操作刪除b使得ab對4取余是3。 獲勝條件&#xff0c;有人…

瀏覽器與服務器的交互

瀏覽器地址欄輸入URL&#xff08;網址??&#xff09; ????(1) 服務器進行URL解析??&#xff1a;驗證URL格式&#xff0c;提取協議、域名等 ????(2) 服務器進行DNS查詢??&#xff1a;將域名轉換為IP地址&#xff08;可能涉及緩存或DNS預取&#xff09; ????…

Spring Boot中POST請求參數校驗的實戰指南

在現代的Web開發中&#xff0c;數據校驗是確保應用程序穩定性和安全性的關鍵環節。Spring Boot提供了強大而靈活的校驗機制&#xff0c;能夠幫助開發者輕松地對POST請求參數進行校驗。本文將詳細介紹如何在Spring Boot中實現POST請求參數的校驗&#xff0c;并通過具體的代碼示例…