給定一個二叉樹,判斷其是否是一個有效的***二叉搜索樹***。
假設一個二叉搜索樹具有如下特徵:
節點的左子樹只包含小於當前節點的數。
節點的右子樹只包含大於當前節點的數。
所有左子樹和右子樹自身必須也是二叉搜索樹。
示例 1:
輸入:
5
/ \
4 7
/ \
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')):
if not root:
return True
val = root.val
if val >= upper or val <= lower:
return False
if not BST(root.left,lower,val):
return False
if not 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
result.append((root.left,val,min_))
result.append((root.right,max_,val))
# 滿足二叉搜索樹的條件應該是result爲空
return True