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

98. 驗證二叉搜索樹

🔍 題目目標

判斷一棵二叉樹是否為有效的二叉搜索樹(BST),定義如下:

  • 左子樹所有節點 < 根節點

  • 右子樹所有節點 > 根節點

  • 且左右子樹也必須是二叉搜索樹


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

該算法使用了遞歸 + 上下界限制法,即為每個節點維護一個值域區間 [left, right],確保節點值在區間內才是有效的 BST。

? 1?? 初始調用:
從根節點 root 開始判斷,默認左右邊界為負無窮和正無窮,即 (-inf, +inf)。表示當前節點理論上可以是任意值。

? 2?? 遞歸邊界判斷:
如果當前節點為 None,說明是空樹或到達葉子節點,屬于有效 BST,返回 True

? 3?? 當前節點合法性判斷:
獲取當前節點值 x = root.val,判斷其是否滿足。

即節點值必須嚴格在當前區間范圍內。

? 4?? 遞歸判斷左右子樹:

  • 左子樹的合法區間更新為 (left, x),即值必須 < 當前節點值;

  • 右子樹的合法區間更新為 (x, right),即值必須 > 當前節點值;

  • 兩者都必須返回 True,整個樹才合法。

? 5?? 使用邏輯與 and 串聯判斷:
只有當前節點合法 左右子樹也為 BST,整體才能返回 True


二、核心點總結

該算法的核心是:

遞歸地對每個節點維護上下邊界區間 [left, right],判斷其值是否符合 BST 的定義,并遞歸驗證左右子樹。

? 采用“值域約束”方式,嚴格驗證 BST 的定義
? 上下界會隨著遞歸深入而收緊,更精確限制節點取值
? 非常適合處理“全局性條件”的驗證場景,如 BST 中的跨層約束
? 簡潔高效,是判斷 BST 有效性的經典做法

class Solution:def isValidBST(self, root: Optional[TreeNode], left=-inf, right=inf) -> bool:if root is None:return True# x = root.valreturn left < root.val < right and \self.isValidBST(root.left, left, root.val) and \self.isValidBST(root.right, root.val, right)

三、時間復雜度分析

  • 每個節點僅訪問一次;

  • 每次訪問包含常數操作和兩次遞歸調用。

因此,時間復雜度為:

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


四、空間復雜度分析

空間主要來自遞歸棧深度

  • 最壞情況是退化成鏈表時遞歸深度為 n

  • 最好情況(平衡樹)遞歸深度為 log n

因此空間復雜度為:

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


? 總結一句話

本算法通過上下界約束方式遞歸判斷每個節點是否符合 BST 條件,時間復雜度 O(n),空間復雜度 O(h),是判斷有效二叉搜索樹的最經典、最推薦方案之一。

非常好,這里我們就結合輸入用例:

root = [5,1,4,null,null,3,6]

用例講解

root = [5,1,4,null,null,3,6]

來詳細還原這段遞歸算法每一步的過程,幫你徹底理解 isValidBST(root, left, right) 的行為。包括每一步的參數、判斷條件、遞歸路徑,以及在什么情況下返回 TrueFalse


🔧 準備工作:還原樹結構

先把這個數組構造的二叉樹結構還原出來(按 LeetCode 層序規則):

        5/ \1   4/ \3   6

我們希望判斷這個樹是否是合法的 BST。


🧠 遞歸過程逐步模擬(輸入:[5,1,4,null,null,3,6])

我們從根節點 5 開始調用:


? Step 1:isValidBST(5, -inf, +inf)

  • 當前節點值:5

  • 是否滿足范圍:-inf < 5 < +inf ?

  • 繼續檢查左右子樹:

→ Step 1.1:isValidBST(1, -inf, 5)(左子樹)
  • 當前值:1

  • 范圍:-inf < 1 < 5 ?

  • 繼續遞歸左右:

→ Step 1.1.1:isValidBST(None, -inf, 1) → 空樹 ?
→ Step 1.1.2:isValidBST(None, 1, 5) → 空樹 ?

?? 1 的子樹都合法 → 返回 True


→ Step 1.2:isValidBST(4, 5, +inf)(右子樹)
  • 當前值:4

  • 范圍:5 < 4 < +inf ? 不合法!

?? 4 不在合法范圍內,直接返回 False!

此處是整個遞歸“剪枝”發生的位置

? 說明什么?說明你不能只看當前節點的左右是否比自己小或大,還要滿足“整個路徑”上的上下界限制(即必須大于所有祖先節點中要求大的那一邊)。


? 最終結果:返回 False

因為右子樹 4 違反了 BST 的約束條件(其值 < 根節點 5,卻出現在右子樹),因此整個樹不是有效的 BST。


📌 小結:每次遞歸都做了什么?

步驟當前節點left boundright bound判斷是否合法結果
15-∞+∞-∞ < 5 < ∞ ?繼續
1.11-∞5-∞ < 1 < 5 ?繼續
1.1.1None-∞1空節點 ?True
1.1.2None15空節點 ?True
1.245+∞? 4 < 5False

? 總結一句話

這套遞歸結構的關鍵是:每個節點必須嚴格落在“它所能合法存在的值域區間”內,這個區間來自于祖先節點不斷遞歸傳下來的上下界。

一旦有節點違反這個區間,即可剪枝終止。

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

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

相關文章

Javaweb - 10.3 Servlet 生命周期

目錄 生命周期簡介 生命周期測試 load-on-startup 補充&#xff1a;defaultServlet Servlet 的繼承結構 1. 頂級的 Servlet 接口 2. 抽線的類 GenericServlet 3. HttpServlet 抽象類 4. 自定義 Servlet 補充&#xff1a; 完&#xff01; 生命周期簡介 什么是生命周…

RSA數字簽名方案的C語言實現(帶測試)

RSA 算法的 C語言實現通常比較復雜&#xff0c;但已經有許多密碼算法庫實現了 RSA 算法&#xff0c;例如OpenSSL、Libgcrypt? 和 Botan ?等。我們可以在這些庫的基礎上進行配置或移植&#xff0c;從而快速實現密碼算法。但這些庫主要面向大量設備進行優化&#xff0c;如通用計…

創客匠人視角:知識變現與創始人 IP 打造的破局之道

當知識付費從流量紅利期進入精耕細作階段&#xff0c;為何專業能力強的內容創作者反而難以變現&#xff1f;創客匠人通過 1500 案例陪跑發現&#xff1a;缺乏 IP 思維的知識輸出如同霧中航行&#xff0c;而創始人 IP 打造正是連接知識價值與商業變現的核心橋梁。一、定位重構&…

結構分析設計軟件 SCIA Engineer 25.0 x64

詳情 Nemetschek SCIA Engineer是一家從事多項目編程、分析和軟件設計的公司。該軟件具有廣泛的不同功能。該軟件可用于以簡單的方式設計建筑物、工業工廠和橋梁。 Nemetschek SCIA Engineer軟件的特點和功能&#xff1a; BIM模型人 使用網格和故事 3D風 自由負載 互聯網…

怎么處理[TOO_MANY_REQUESTS/12/disk usage exceeded flood-stage watermark

這個錯誤說明 Elasticsearch 的磁盤空間嚴重不足&#xff0c;已觸及最高級別&#xff08;flood-stage&#xff09;的水位線。作為自我保護機制&#xff0c;Elasticsearch ?自動將受影響的索引設置為只讀模式 (read-only-allow-delete)?&#xff0c;從而阻止寫入操作&#xff…

pytorch學習-11卷積神經網絡(高級篇)

2.線性模型 3.梯度下降算法 4.反向傳播(用pytorch算梯度) 5.用pytorch實現線性回歸 6.logistic回歸 7.處理多維特征的輸入 8.加載數據集 9.多分類問題 10.卷積神經網絡(基礎篇) 11.卷積神經網絡&#xff08;高級篇&#xff09;_嗶哩嗶哩_bilibili 11.1 GoogleNet Google…

ubuntu 安裝QT

在 Ubuntu 系統上安裝 Qt 可以通過以下步驟完成&#xff0c;以下是詳細的安裝指南 &#xff1a; 1. 安裝前的準備工作 在開始安裝 Qt 之前&#xff0c;需要確保你的 Ubuntu 系統已經更新到最新版本&#xff0c;并且安裝了一些必要的依賴。 1.1 更新系統 首先&#xff0c;打…

CppCon 2018 學習:RAPID PROTOTYPING OF GRAPHICS SHADERS IN

這段內容在講**著色器&#xff08;Shader&#xff09;**的基礎概念&#xff0c;尤其是它在現代 GPU&#xff08;圖形處理單元&#xff09;中的作用。以下是逐條解釋與理解&#xff1a; “Depicting depth perception in 3D models or illustrations by varying levels of darkn…

Angular v20版本正式發布

過去幾年對 Angular 來說很具變革性,我們推出了像 Signals 這樣的反應性功能和 Zoneless 應用的強大能力。我們希望這些功能可以幫助 Angular 社區構建下一代的 Web 應用,實現快速上市和強大的性能。 我們的旅程才剛剛開始!Angular v20 是最新的發布版本,我們花費了無數個小…

Oracle如何使用序列 Oracle序列使用教程

Oracle序列&#xff08;sequence&#xff09;是一種數據庫項&#xff0c;能夠生成一個整數序列。通常用于填充數字類型的主鍵列。 Oracle序列 Oracle序列使用教程&#xff1a; 1、創建序列&#xff1a; CREATE SEQUENCE sequence_name[START WITH start_num][INCREMENT BY incr…

深入探索 Vanna:讓數據庫交互更智能

深入探索 Vanna&#xff1a;讓數據庫交互更智能 在數字化時代&#xff0c;與數據庫進行高效交互是許多開發者、數據分析師和企業面臨的挑戰。傳統的 SQL 查詢編寫不僅需要對數據庫結構有深入的了解&#xff0c;還需要花費大量的時間和精力來調試和優化。Vanna&#xff0c;一個…

C#上位機之網口通信與協議!

文章目錄前言一、網口通信概念二、使用網口通信準備三、使用步驟前言 C#上位機之網口通信與協議&#xff01; 一、網口通信概念 定義 &#xff1a;Socket 可以理解為一個通信端點&#xff0c;它提供了應用程序與網絡之間的接口&#xff0c;使得應用程序能夠在網絡上發送和接收…

Android Studio 創建類時如何自動添加類注釋

打開IDEA或AS&#xff0c;點擊菜單欄File——Settings——Editor——File and Code Templates。 點擊右邊Tab頁的Includes&#xff0c;選擇File Header&#xff0c;修改類頭模版&#xff0c;如圖&#xff1a; 記得選中Project&#xff0c;否則默認是整個AS都會進行設置

C++11:shared_ptr的設計哲學(原理+源碼):內存安全和性能的架構權衡

0.簡介 在C編程世界中&#xff0c;內存管理是一把雙刃劍&#xff0c;手動管理帶來了極致的內存控制能力&#xff0c;但也帶來了像內存泄漏&#xff0c;野指針等問題&#xff1b;自動垃圾回收雖然安全&#xff0c;但卻會帶來一定的性能損耗。本文將介紹C11引入shared_ptr&#…

Mysql EXPLAIN 執行計劃

EXPLAIN SELECT SQl。。。。界面filtered儲引擎返回的數據在經過服務器層 WHERE 條件過濾后&#xff0c;剩余數據占總行數的百分比估計值rows * filtered/100 越接近100%效率越高rowspossible_keys 可能選擇的索引key最終決定選擇的行partitions問了哪些分區select_type查詢…

力扣刷題記錄【1】146.LRU緩存

前言&#xff1a; 請你設計并實現一個滿足 LRU (最近最少使用) 緩存 約束的數據結構。 實現 LRUCache 類&#xff1a; LRUCache(int capacity) 以 正整數 作為容量 capacity 初始化 LRU 緩存int get(int key) 如果關鍵字 key 存在于緩存中&#xff0c;則返回關鍵字的值&…

西門子S7-1200 PLC主流通信方法及應用

一、通信基礎 1. 網絡術語與設備 - 關鍵設備&#xff1a;交換機、路由器、網關等。 - 物理接口&#xff1a;RS-485&#xff08;支持多點通信&#xff09;、RS-232C&#xff08;點對點串行通信&#xff09;。 2. OSI參考模型 - 核心框架&#xff1a;理解協議分層&…

MySQL實現任意級子目錄的主要方案以及區別

常見的實現方案及區別 1. 鄰接表&#xff08;Adjacency List&#xff09; 方案描述&#xff1a; 每條記錄存儲一個節點的父節點ID。 表結構大致&#xff1a; id INT PRIMARY KEY, name VARCHAR(...), parent_id INT -- 指向父節點的ID&#xff0c;根節點為NULL或0優點&…

Linux網絡socket套接字(完)(5)

文章目錄前言一、多進程版的Tcp網絡程序捕捉SIGCHLD信號讓孫子進程提供服務二、多線程版的Tcp網絡程序三、線程池版的Tcp網絡程序四、Tcp協議通訊流程通訊流程總覽三次握手的過程數據傳輸的過程四次揮手的過程總結前言 結束嘍&#xff0c;至少這個Tcp套接字有關內容要結束了~ ?…

Web3 Study Log 003

Web3 Study Log 003 2025-7-5 這幾天各種各樣的瑣事&#xff0c;處理完了&#xff0c;真的煩&#xff0c;估計能消停一段時間了… 今天終于能夠坐下來好好學習&#xff0c;今天學習了chainlink的使用&#xff0c;能夠獲取 ETH/USD 實時價格&#xff0c;然后寫了一個簡單的眾…