LeetCode98:驗證二叉搜索樹,居然有這麼簡單的中等難度,白撿(用時擊敗100%)

来源:https://www.cnblogs.com/bolingcavalry/archive/2023/09/12/17689785.html
-Advertisement-
Play Games

歡迎訪問我的GitHub 這裡分類和彙總了欣宸的全部原創(含配套源碼):https://github.com/zq2599/blog_demos 關於LeetCode98 做這道題之前,我反覆審題,最後確認:沒錯,不存在什麼坑,這道題確實非常非常簡單,然而卻被官方定義為中等難度 這一定是送分,白撿一 ...


歡迎訪問我的GitHub

這裡分類和彙總了欣宸的全部原創(含配套源碼):https://github.com/zq2599/blog_demos

關於LeetCode98

  • 做這道題之前,我反覆審題,最後確認:沒錯,不存在什麼坑,這道題確實非常非常簡單,然而卻被官方定義為中等難度
  • 這一定是送分,白撿一道中等難度題,接下來,一起來輕鬆愉快的享受解題過程吧

關於題目

  • 題目:98. 驗證二叉搜索樹
  • 描述
給你一個二叉樹的根節點 root ,判斷其是否是一個有效的二叉搜索樹。

有效 二叉搜索樹定義如下:

節點的左子樹只包含 小於 當前節點的數。
節點的右子樹只包含 大於 當前節點的數。
所有左子樹和右子樹自身必須也是二叉搜索樹
  • 示例 1:
    在這裡插入圖片描述
輸入:root = [2,1,3]
輸出:true
  • 示例2:
    在這裡插入圖片描述
輸入:root = [5,1,4,null,null,3,6]
輸出:false
解釋:根節點的值是 5 ,但是右子節點的值是 4 。
  • 提示:
樹中節點數目範圍在[1, 104] 內
-231 <= Node.val <= 231 - 1

分析

  • 簡單的說,此題的要求如下圖所示:紅色節點的值都小於100,藍色節點的值都大於100,然後,往每個子節點上套這個規則即可
    在這裡插入圖片描述
  • 此題有兩處需要註意:
  1. 對於任意節點,它的左子樹都要小於節點值,右子樹必須大於節點值,不允許等於,一旦出現就返回false
  2. 節點值的範圍:下限是int的最小值,上限是int的最大值
  • 只要註意以上兩點,就能憑藉最基礎的二叉樹遍歷基本功解題了

解題思路

  • 還是以下圖來說明
    在這裡插入圖片描述
  • 上圖中,不論紅色還是藍色節點,都可以設置好一個範圍區間,然後檢查這些節點在不在區間內,這就是解題思路
  • 其實就是中規中矩的前序遍歷(口訣:根左右),每個節點都是先檢查自己在不在規定範圍內,然後再處理其左子樹和右子樹,在處理的時候,要重新設定範圍,對左子樹,要更新上限,對右子樹,要更新下限
  • 上圖中,對紅色節點的要求是小於100,也就是說上限是100,至於下限?無所謂,那就用int的最小值-2147483648作為下限?
  • 絕對不行!!!因為:節點值可能就是int的最小值!
  • 同理,處理藍色節點的時候,也不能用int型的最大值2147483647作為上限
  • 要用long型的最小值作為紅色的下限,long型的最大值作為上限
  • 分析完成,接下來開始編碼

編碼

  • 完整代碼如下,唯一要註意的就是預設上限是Long.MAX_VALUE,預設下限是Long.MIN_VALUE:
class Solution {
    public boolean isValidBST(TreeNode root) {

        // 左子樹,只要求不能比自己大,至於小到什麼程度都無所謂,所以用int最小值作為左側邊界
        if (!isValidBST(root.left, Long.MIN_VALUE, root.val)) {
            return false;
        }

        // 右子樹,只要求不能比自己小,至於達到什麼程度都無所謂,所以用int最大值作為右側邊界
        if (!isValidBST(root.right, root.val, Long.MAX_VALUE)) {
            return false;
        }

        return true;
    }

    public boolean isValidBST(TreeNode root, long min, long max) {
        if (null==root) {
            return true;
        }

        // 檢查自己
        // 註意審題:左側必須比自己小,不接受等於,右側必須必自己大,不接受等於
        if (root.val<=min || root.val>=max) {
            return false;
        }

        // 左子樹,只要求不能比自己大,至於小到什麼程度都無所謂,所以用入參的最小值作為左側邊界
        if (!isValidBST(root.left, min, Math.min(max, root.val))) {
            return false;
        }

        // 右子樹,只要求不能比自己小,至於達到什麼程度都無所謂,所以用入參的最大值作為右側邊界
        if (!isValidBST(root.right, Math.max(min, root.val), max)) {
            return false;
        }

        return true;
    }
}
  • 提交,順利AC,用時擊敗100%
    在這裡插入圖片描述
  • 至此,解題完成,至今也沒弄明白,一個二叉樹遍歷基本功考核,怎麼就成了中級難度

歡迎關註博客園:程式員欣宸

學習路上,你不孤單,欣宸原創一路相伴...


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在可執行文件PE文件結構中,通常我們需要用到地址轉換相關知識,PE文件針對地址的規範有三種,其中就包括了`VA`,`RVA`,`FOA`三種,這三種該地址之間的靈活轉換也是非常有用的,本節將介紹這些地址範圍如何通過編程的方式實現轉換。VA(Virtual Address,虛擬地址):它是在進程的虛擬... ...
  • 簡介 說明 本文介紹 Java 內部類持有外部類導致記憶體泄露的原因以及其解決方案。 為什麼內部類持有外部類會導致記憶體泄露 非靜態內部類會持有外部類,如果有地方引用了這個非靜態內部類,會導致外部類也被引用,垃圾回收時無法回收這個外部類(即使外部類已經沒有其他地方在使用了)。 解決方案 不要讓其他的地方 ...
  • 平衡二叉樹(Balanced Binary Tree) 平衡二叉樹是一種特殊的二叉搜索樹,它具有以下特點: 每個節點的左子樹和右子樹的高度差不超過1。 所有的子樹也都是平衡二叉樹。 通過保持平衡性,平衡二叉樹可以在最壞情況下仍然具有較好的性能,保證查找、插入和刪除操作的時間複雜度為O(log n)。 ...
  • 二叉搜索樹(Binary Search Tree,BST) 二叉搜索樹(Binary Search Tree),也稱二叉查找樹或二叉排序樹,是一種特殊的二叉樹,它滿足以下性質 對於二叉搜索樹的每個節點 左子樹中的所有節點的值都小於該節點的值 右子樹中的所有節點的值都大於(或等於)該節點的值 對於二叉 ...
  • 關註公眾號【TechLeadCloud】,分享互聯網架構、雲服務技術的全維度知識。作者擁有10+年互聯網服務架構、AI產品研發經驗、團隊管理經驗,同濟本復旦碩,復旦機器人智能實驗室成員,阿裡雲認證的資深架構師,項目管理專業人士,上億營收AI產品研發負責人。 語句 語句是Go編程語言中完成特定操作的單 ...
  • 二叉樹(binary tree) 二叉樹(Binary Tree)是一種常見的樹狀數據結構,它由一組節點組成,每個節點最多有兩個子節點,分別稱為左子節點和右子節點。二叉樹具有以下特點: 每個節點最多有兩個子節點,分別稱為左子節點和右子節點。 左子樹和右子樹也是二叉樹,它們的結構與父節點類似。 二叉樹 ...
  • 來源:https://www.cnblogs.com/zisefeizhu/p/13692782.html 前言 我司的集群時刻處於崩潰的邊緣,通過近三個月的掌握,發現我司的集群不穩定的原因有以下幾點: 1、發版流程不穩定 2、缺少監控平臺【最重要的原因】 3、缺少日誌系統 4、極度缺少有關操作文檔 ...
  • 面試題:@Transactional聲明式事務註解什麼時候會失效 前言 今天來分享一道比較有意思的面試題,“@Transactional聲明式事務註解什麼時候會失效?”。 對於這個問題,我們一起看看考察點和比較好的回答吧! 考察點 這個問題就是面試官想考察我們對@Transactional註解有沒有 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 推薦一款基於.NET 8、WPF、Prism.DryIoc、MVVM設計模式、Blazor以及MySQL資料庫構建的企業級工作流系統的WPF客戶端框架-AIStudio.Wpf.AClient 6.0。 項目介紹 框架採用了 Prism 框架來實現 MVVM 模式,不僅簡化了 MVVM 的典型 ...
  • 先看一下效果吧: 我們直接通過改造一下原版的TreeView來實現上面這個效果 我們先創建一個普通的TreeView 代碼很簡單: <TreeView> <TreeViewItem Header="人事部"/> <TreeViewItem Header="技術部"> <TreeViewItem He ...
  • 1. 生成式 AI 簡介 https://imp.i384100.net/LXYmq3 2. Python 語言 https://imp.i384100.net/5gmXXo 3. 統計和 R https://youtu.be/ANMuuq502rE?si=hw9GT6JVzMhRvBbF 4. 數 ...
  • 本文為大家介紹下.NET解壓/壓縮zip文件。雖然解壓縮不是啥核心技術,但壓縮性能以及進度處理還是需要關註下,針對使用較多的zip開源組件驗證,給大家提供個技術選型參考 之前在《.NET WebSocket高併發通信阻塞問題 - 唐宋元明清2188 - 博客園 (cnblogs.com)》講過,團隊 ...
  • 之前寫過兩篇關於Roslyn源生成器生成源代碼的用例,今天使用Roslyn的代碼修複器CodeFixProvider實現一個cs文件頭部註釋的功能, 代碼修複器會同時涉及到CodeFixProvider和DiagnosticAnalyzer, 實現FileHeaderAnalyzer 首先我們知道修 ...
  • 在軟體行業,經常會聽到一句話“文不如表,表不如圖”說明瞭圖形在軟體應用中的重要性。同樣在WPF開發中,為了程式美觀或者業務需要,經常會用到各種個樣的圖形。今天以一些簡單的小例子,簡述WPF開發中幾何圖形(Geometry)相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 在 C# 中使用 RabbitMQ 通過簡訊發送重置後的密碼到用戶的手機號上,你可以按照以下步驟進行 1.安裝 RabbitMQ 客戶端庫 首先,確保你已經安裝了 RabbitMQ 客戶端庫。你可以通過 NuGet 包管理器來安裝: dotnet add package RabbitMQ.Clien ...
  • 1.下載 Protocol Buffers 編譯器(protoc) 前往 Protocol Buffers GitHub Releases 頁面。在 "Assets" 下找到適合您系統的壓縮文件,通常為 protoc-{version}-win32.zip 或 protoc-{version}-wi ...
  • 簡介 在現代微服務架構中,服務發現(Service Discovery)是一項關鍵功能。它允許微服務動態地找到彼此,而無需依賴硬編碼的地址。以前如果你搜 .NET Service Discovery,大概率會搜到一大堆 Eureka,Consul 等的文章。現在微軟為我們帶來了一個官方的包:Micr ...
  • ZY樹洞 前言 ZY樹洞是一個基於.NET Core開發的簡單的評論系統,主要用於大家分享自己心中的感悟、經驗、心得、想法等。 好了,不賣關子了,這個項目其實是上班無聊的時候寫的,為什麼要寫這個項目呢?因為我單純的想吐槽一下工作中的不滿而已。 項目介紹 項目很簡單,主要功能就是提供一個簡單的評論系統 ...