leetcode98 驗證二叉搜尋樹

2021-10-23 00:02:42 字數 2914 閱讀 8323

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。

假設乙個二叉搜尋樹具有如下特徵:

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 如果對二叉搜尋樹不夠了解,可能...