98. 驗證二叉搜索樹

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

假設一個二叉搜索樹具有如下特徵:

節點的左子樹只包含小於當前節點的數。
節點的右子樹只包含大於當前節點的數。
所有左子樹和右子樹自身必須也是二叉搜索樹。
示例 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章