經典圖論面試題 Validate Binary Search Tree_Leetcode #98

閱讀時間約 3 分鐘
raw-image

題目在這裡: Validate Binary Search Tree

題目會給定一顆二元樹的根結點,要求我們驗證這一顆樹是否為合法的二元搜索樹,也就是所謂的Binary search tree, aka BST?

題目也給了BST的定義:

  1. 所有左子樹的節點的值都小於 根節點的值
  2. 所有右子樹的節點的值都大於 根節點的值
  3. 所有左子樹和右子樹的分支也都遵循相同的規則。

測試範例

Example 1:

raw-image
Input: root = [2,1,3]
Output: true

Example 2:

raw-image
Input: root = [5,1,4,null,null,3,6]
Output: false
Explanation: The root node's value is 5 but its right child's value is 4.

演算法

其實這題有很多種解法,但是剛好二元搜索樹有一個單調遞增的性質

也就是說,如果使用前面提過的inorder traversal拜訪整顆樹,那拜訪的軌跡剛好會從小到大排列。

因此,我們可以先給定一個上、下邊界,分別是(最小正整數最大正整數)來包住整顆樹的合理值的範圍,接著不斷依照當下節點的值動態更新對應的(下區間,上區間),最後遞迴檢查左子樹和右子樹。

raw-image


假如過程中發現有一個節點的值超出合理範圍,就return False,代表這顆樹
不是合法的BST。

假如全部檢查完,所有節點都或在合理範圍,就return True,代表這顆樹是合法的BST


程式碼

class Solution:
 def isValidBST(self, root: TreeNode) -> bool:
  
  # Use maximal system integer to represent infinity
  INF = sys.maxsize
  
  def helper(node, lower, upper):
   
   if not node:
    # empty node or empty tree
    return True
   
   if lower < node.val < upper:
    # check if all tree nodes follow BST rule
    return helper(node.left, lower, node.val) and helper(node.right, node.val, upper)
   
   else:
    # early reject when we find violation
    return False
   
  # ----------------------------------
  
  return helper( node=root, lower=-INF, upper=INF )

複雜度分析

時間複雜度:

O( n ) 從根節點,依循DFS框架,拜訪整顆樹,每個節點最多拜訪一次。

空間複雜度:

O(n) 成本耗費在遞迴呼叫時建立的call stack,最深的深度至多可為O(n),當整顆樹向左歪斜,或者向右歪斜時。


Reference:

[1] Python/JS/Java/Go/C++ O(n) by DFS and rule [w/ Hint] — Validate Binary Search Tree — LeetCode

82會員
417Content count
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目會給我們一個輸入陣列,長度為n+1。 陣列裡面會有n+1個數字,數字的範圍從1到n 裡面恰好有一個數字重複出現,要求我們找出那個重複的數字。 題目要求只能使用常數空間O(1),並且限制不能修改陣列內容。
題目會給定給我們一顆二元樹的根結點,要求我們輸出Level-order traversal的拜訪結果。 在這題,我們會複習並利用BFS模板,來實現逐層搜索演算法。
其實常見的tree traversal (前序、中序、後序拜訪), 背後的核心觀念都是相同的。 Tree traversal其實就是探索整顆樹的搜索空間,也可以說是探索整顆樹, 只是指定順序略有不同而已。 本文將結合經典的DFS模板,做一個全面性的回顧。
題目會給定一顆樹,要求我們輸出所有從Root node根節點 到 Leaf node 葉子節點的路徑。 我們會介紹DFS模板 + Tree search演算法的框架來解題
Leetcode #101 Symmetric Tree 題目會給定一顆樹,要求我們判定這棵樹是不是左右鏡像對稱(Symmetric)。
圖論常用的演算法BFS 與 DFS 的統整與比較。 介紹常用且相關的底層資料結構 並且,介紹幾個適合使用的應用領域、解題分類。
題目會給我們一個輸入陣列,長度為n+1。 陣列裡面會有n+1個數字,數字的範圍從1到n 裡面恰好有一個數字重複出現,要求我們找出那個重複的數字。 題目要求只能使用常數空間O(1),並且限制不能修改陣列內容。
題目會給定給我們一顆二元樹的根結點,要求我們輸出Level-order traversal的拜訪結果。 在這題,我們會複習並利用BFS模板,來實現逐層搜索演算法。
其實常見的tree traversal (前序、中序、後序拜訪), 背後的核心觀念都是相同的。 Tree traversal其實就是探索整顆樹的搜索空間,也可以說是探索整顆樹, 只是指定順序略有不同而已。 本文將結合經典的DFS模板,做一個全面性的回顧。
題目會給定一顆樹,要求我們輸出所有從Root node根節點 到 Leaf node 葉子節點的路徑。 我們會介紹DFS模板 + Tree search演算法的框架來解題
Leetcode #101 Symmetric Tree 題目會給定一顆樹,要求我們判定這棵樹是不是左右鏡像對稱(Symmetric)。
圖論常用的演算法BFS 與 DFS 的統整與比較。 介紹常用且相關的底層資料結構 並且,介紹幾個適合使用的應用領域、解題分類。
你可能也想看
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
題目敘述 題目會給我們一串相鄰矩陣isConnected,相鄰矩陣的元素值isConnected[i][j] 代表第i座城市和第j座城市是否有連通。 如果彼此有連通,則isConnected[i][j]=1。 如果彼此沒有連通,則isConnected[i][j]=0。 彼此互相有路徑可以
Thumbnail
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 並且給定感染的病毒源節點位置,每個單位時間,可以向相鄰的節點感染一次,問我們需要多少時間去感染整棵樹? 題目的原文敘述 測試範例 Example 1: Input: root = [1,5,3,null,4,10,6,
Thumbnail
題目敘述 題目會給定我們一顆二元搜索樹BST的根結點, 還有一個指定區間的上邊界R 和 下邊界L。 請問二元搜索樹中,所有落在指定區間內的節點元素值的總和是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [10,5,15,3,7,null,18], l
Thumbnail
題目會給我們一顆二元樹的根節點, 要求我們對齊根節點正中央的虛擬分割線,反轉整顆二元樹。
Thumbnail
題目會給定一顆二元樹的根結點,要求我們驗證這一顆樹是否為合法的二元搜索樹, 也就是所謂的Binary search tree, aka BST?
Thumbnail
WBC棒球經典賽的選手來自臺灣各地,究竟哪裡的人最多呢?仔細研究可以發現,其中還有不少人是同一所小學畢業的。
Thumbnail
跟外川第一次的意見不合就如此慘痛,野末從沒想過會是這種發展,也讓他深刻體驗到外川竟如此強勢(這就是年下攻嗎?)
Thumbnail
孩子們都很期待過聖誕節,因為這是一個可以拿禮物的日子,還可以欣賞漂亮的聖誕樹和閃亮亮的燈飾,真的是滿滿的幸福感呢。不過說到送禮物,每家規定不同,而禮物不嫌多,如果可以有更多禮物,誰會覺得不好呢!
Thumbnail
心智圖發想法(純文字版)練習方法 首先把要解決問題的關鍵字,寫出來, 接著我們再把和關鍵字有關的類別列出來, 作練習的過程當中如果中途想到甚麼, 都可以隨時補充! 點子大富翁們,開始練習吧! 關鍵字: 老舊書店
Thumbnail
之前去土耳其自由行時,意外發現當地香水文化非常興盛,而且最有趣的是,隨處可見各種香水專賣店不說,還不少標榜「複刻」經典專櫃品牌香水,媽媽我想長住土耳其!(毆)
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
題目敘述 題目會給我們一串相鄰矩陣isConnected,相鄰矩陣的元素值isConnected[i][j] 代表第i座城市和第j座城市是否有連通。 如果彼此有連通,則isConnected[i][j]=1。 如果彼此沒有連通,則isConnected[i][j]=0。 彼此互相有路徑可以
Thumbnail
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 並且給定感染的病毒源節點位置,每個單位時間,可以向相鄰的節點感染一次,問我們需要多少時間去感染整棵樹? 題目的原文敘述 測試範例 Example 1: Input: root = [1,5,3,null,4,10,6,
Thumbnail
題目敘述 題目會給定我們一顆二元搜索樹BST的根結點, 還有一個指定區間的上邊界R 和 下邊界L。 請問二元搜索樹中,所有落在指定區間內的節點元素值的總和是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [10,5,15,3,7,null,18], l
Thumbnail
題目會給我們一顆二元樹的根節點, 要求我們對齊根節點正中央的虛擬分割線,反轉整顆二元樹。
Thumbnail
題目會給定一顆二元樹的根結點,要求我們驗證這一顆樹是否為合法的二元搜索樹, 也就是所謂的Binary search tree, aka BST?
Thumbnail
WBC棒球經典賽的選手來自臺灣各地,究竟哪裡的人最多呢?仔細研究可以發現,其中還有不少人是同一所小學畢業的。
Thumbnail
跟外川第一次的意見不合就如此慘痛,野末從沒想過會是這種發展,也讓他深刻體驗到外川竟如此強勢(這就是年下攻嗎?)
Thumbnail
孩子們都很期待過聖誕節,因為這是一個可以拿禮物的日子,還可以欣賞漂亮的聖誕樹和閃亮亮的燈飾,真的是滿滿的幸福感呢。不過說到送禮物,每家規定不同,而禮物不嫌多,如果可以有更多禮物,誰會覺得不好呢!
Thumbnail
心智圖發想法(純文字版)練習方法 首先把要解決問題的關鍵字,寫出來, 接著我們再把和關鍵字有關的類別列出來, 作練習的過程當中如果中途想到甚麼, 都可以隨時補充! 點子大富翁們,開始練習吧! 關鍵字: 老舊書店
Thumbnail
之前去土耳其自由行時,意外發現當地香水文化非常興盛,而且最有趣的是,隨處可見各種香水專賣店不說,還不少標榜「複刻」經典專櫃品牌香水,媽媽我想長住土耳其!(毆)