Valid 的二元搜尋樹 | Medium| LeetCode#98. Validate Binary Search Tree
題目敘述
- 題目難度:
Medium
- 題目敘述: 題目給定一個 Binary Tree 的
root
,我們需要確認這棵 Binary Tree 是否是 Binary Search Tree
一個 valid 的 Binary Search Tree(BST) 包含了:
- 對於任意節點,其 Left SubTree 的任意節點值一定小於當前節點值
- 對於任意節點,其節點值一定小於其 Right SubTree 的任意節點值
- Left SubTree 和 Right SubTree 都要是 binary search tree
解法
一開始的想法
這題想法很簡單,這題的花費時間很少,首先可以知道的是: BST 從小到大走訪,其走訪順序會是對同一棵樹進行 inorder traversal。 所以只要能夠 在 Inorder 走訪過程中比較前一個節點值與當前節點值,看前一個節點是否比當前節點小即可
我的解法
1 | /** |
這裡多宣告了一個節點叫做 prev
用來儲存 inorder traversal 過程中的前一個節點,另外透過一個變數 result
來儲存是否valid的狀態。一旦 prev
存在且大於當前節點,則將 result
狀態變更為 false
。在每次visiting 節點過程會將當前節點更新到 prev
,以便下一次的比較。
之後便是回傳結果到 isValidBST
函數中,返回結果。
執行結果
其他做法
1 | class Solution { |
我看解答區普遍有其他做法,這種作法主要定義了另一個用來確定是否為 BST 的 validate
函數,其中的參數會給定上界和下界,一旦給定的下界小於當前節點值,而當前節點值小於上界,就持續遞迴,將node的左右child分別傳入參數。而其他情形則回傳 false,而return 結果需要左右子樹都是BST return validate(node->left, lower, node->val) && validate(node->right, node->val, upper);
最後才會是 valid 結果。
複雜度
時間複雜度
$O(N)$, $N$ 為節點總數。
空間複雜度
$O(H)$, worst-case: $H = N$
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Kevin Liu's 部落格 || Technical || Travel!
評論