98 驗證二叉搜尋樹

2021-10-04 00:13:37 字數 2233 閱讀 7772

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

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

節點的左子樹只包含小於當前節點的數。

節點的右子樹只包含大於當前節點的數。

所有左子樹和右子樹自身必須也是二叉搜尋樹。

示例 1:

輸入:

5/ \

47/ \ 3

8輸出: false

思路:剛開始看半天沒看懂,然後pycharm debug走了一下,頭緒來了。

如樓上的輸入,首先根節點5會和給定的上下界做比較。如果在範圍內,繼續考慮5的左右子樹的情況。和左子樹相比,5作為上界,和右子樹相比,5作為下界。這樣的話到3這個節點的時候由於它的上下界為7,5,所以不滿足情況,返回false。

另外注意本題考慮了葉子節點的情況,葉子節點的左右子樹不存在,所以返回的是true,而不是false。

# definition for a binary tree node.

class

treenode

:def

__init__

(self, x)

: self.val = x

self.left =

none

self.right =

none

class

solution

:def

isvalidbst

(self, root: treenode)

->

bool

:def

bst(root, lower =

float

('-inf'

),upper =

float

('inf'))

:ifnot root:

return

true

val = root.val

if val >= upper or val <= lower:

return

false

ifnot bst(root.left,lower,val)

:return

false

ifnot bst(root.right,val,upper)

:return

false

return

true

return bst(root)

a = treenode(6)

b = treenode(3)

c = treenode(8)

d = treenode(1)

e = treenode(4)

a.left = b

a.right = c

b.left = d

b.right = e

print

(solution(

).isvalidbst(a)

)

迭代演算法,主要是建立乙個可迭代的物件,例如列表,佇列,先預存放一組資料,然後每次迴圈判斷序列是否為空,不為空則繼續判斷條件,新增資料進去。直到隊列為空。其實迭代演算法也需要依賴前面的值求後面的值,就像max_和min_的動態變化

class

solution

:def

isvalidbst

(self, root: treenode)

->

bool:if

not root:

return

true

result =

[(root,

float

('inf'),

float

('-inf'))

]while result:

# 每次處理乙個節點

root,max_,min_ = result.pop()if

not root :

continue

val = root.val

if val >= max_ or val <= min_:

return

false

(root.left,val,min_)

)(root.right,max_,val)

)# 滿足二叉搜尋樹的條件應該是result為空

return

true

98 驗證二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 1 3 輸出 true 示例 2 輸入 5 1 4 3 6 輸出 false 解釋 ...

98 驗證二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 示例 1 輸入 2 1 3 輸出 true示例 2 輸入 5 1 4 3 6 輸出 false 解釋 輸入為 5,1,4,null,null,3,6 根節點的值為 5 但是其右子節點值為 4 import sys cl...

98 驗證二叉搜尋樹

98.驗證二叉搜尋樹 分析這道驗證二叉搜尋樹有很多種解法,可以利用它本身的性質來做,即左 根 右,也可以通過利用中序遍歷結果為有序數列來做,下面我們先來看最簡單的一種,就是利用其本身性質來做,初始化時帶入系統最大值和最小值,在遞迴過程中換成它們自己的節點值,用long代替int就是為了包括int的邊...