給定乙個二叉樹,判斷其是否是乙個有效的***二叉搜尋樹***。
假設乙個二叉搜尋樹具有如下特徵:
節點的左子樹只包含小於當前節點的數。
節點的右子樹只包含大於當前節點的數。
所有左子樹和右子樹自身必須也是二叉搜尋樹。
示例 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的邊...