給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。
假設乙個二叉搜尋樹具有如下特徵:
1.節點的左子樹只包含小於當前節點的數。
2.節點的右子樹只包含大於當前節點的數。
3.所有左子樹和右子樹自身必須也是二叉搜尋樹。
解法一:使用中序遍歷,得到的陣列是公升序的,優化方法是判斷當前節點大於前繼節點即可。檢查 inorder中的每個元素是否小於下乙個
解法二:遞迴法。遞迴返回需要傳出兩個值,對於左子樹找到最大值返回a,對於右子樹找到最小值返回b,那麼root要大於a, 且root小於b,就可以繼續往下迴圈,直到所有節點滿足這個即可。
兩 種解
法都是只
會訪問節
點一次,
所以時間
複雜度都
為o(n
)\color兩種解法都是只會訪問節點一次,所以時間複雜度都為o(n)
兩種解法都是
只會訪問
節點一次
,所以時
間複雜度
都為o(
n)解法一:
第乙個寫法是比較直接的,就是按照中序遍歷的方式獲取陣列,若是公升序,與排序後的陣列相同,證明是二叉搜尋樹。 不過缺點是inorder的函式需要開闢新的空間,空間複雜度比較高。
第二個寫法就做了一下優化,我們不需要保留整個陣列下來,只需儲存前繼節點就可以,然後當前節點和前繼節點比較即可。helper其實就是實現了中序遍歷,
解法二:
倒數第三局,max代表上界,min代表下界,如果超出界外,就不對了. 不要誤會成上面的解題思路的最大值a和最小值b,我自己回頭看就看暈了~~
重點關注倒數第二句,看左子樹時,無論你後面的值怎樣,都要小於當前節點的,所以更改上界為root.val。看右子樹是同理,當前節點要小於右子樹所有節點,更新下界.
class
solution
:def
isvalidbst
(self, root: treenode)
->
bool
: inorder = self.inorder(root)
return inorder ==
list
(sorted
(set
(inorder)))
definorder
(self,root)
:if root is
none
:return
return self.inorder(root.left)
+[root.val]
+self.inorder(root.right)--
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
---class
solution
:def
isvalidbst
(self, root: treenode)
->
bool
: self.prev =
none
return self.helper(root)
defhelper
(self,root)
:if root is
none
:return
true
ifnot self.helper(root.left)
:# 左子樹
return
false
if self.prev and self.prev.val >= root.val:
#如果前乙個數大於後乙個,錯誤
return
false
self.prev = root #跟換root為前乙個結點
return self.helper(root.right)
#右子樹
解法二:
class
solution
:def
isvalidbst
(self, root: treenode)
->
bool
:def
isbst
(root, min_val, max_val)
:if root ==
none
:return
true
# print(root.val)
if root.val >= max_val or root.val <= min_val:
#max代表上界,min代表下界,如果超出界外,就不對了
return
false
return isbst(root.left, min_val, root.val)
and isbst(root.right, root.val, max_val)
return isbst(root,
float
("-inf"),
float
("inf"))
#正負無窮
復 雜度
分析:\color
複雜度分析:
時間複雜度 : o(n)。每個結點訪問一次。
空間複雜度 : o(n)。我們跟進了整棵樹。
高階分析:
leetcode 98 驗證二叉搜尋樹
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。乙個二叉搜尋樹具有如下特徵 示例 1 輸入 1 3 輸出 true 示例 2 輸入 1 4 3 6 輸出 false 解釋 輸入為 5,1,4,null,null,3,6 根節點的值為 5 但是其右子節點值為 4 關鍵資訊 1二叉搜尋樹的中序遍歷是遞...
leetcode 98 驗證二叉搜尋樹
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。乙個二叉搜尋樹具有如下特徵 示例 1 輸入 2 1 3 輸出 true示例 2 輸入 5 1 4 3 6 輸出 false 解釋 輸入為 5,1,4,null,null,3,6 根節點的值為 5 但是其右子節點值為 4 解題思路 中序遍歷遞增,每次只...
leetcode 98 驗證二叉搜尋樹
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。乙個二叉搜尋樹具有如下特徵 示例 1 輸入 2 1 3 輸出 true示例 2 輸入 5 1 4 3 6 輸出 false 解釋 輸入為 5,1,4,null,null,3,6 根節點的值為 5 但是其右子節點值為 4 如果對二叉搜尋樹不夠了解,可能...