1. 程式人生 > >【LeetCode】【Python】驗證二叉搜尋樹

【LeetCode】【Python】驗證二叉搜尋樹

題目

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

一個二叉搜尋樹具有如下特徵:

  • 節點的左子樹只包含小於當前節點的數。
  • 節點的右子樹只包含大於當前節點的數。
  • 所有左子樹和右子樹自身必須也是二叉搜尋樹。

示例 1:

輸入:
    2
   / \
  1   3
輸出: true

示例 2:

輸入:
    5
   / \
  1   4
     / \
    3   6
輸出: false
解釋: 輸入為: [5,1,4,null,null,3,6]。
     根節點的值為 5 ,但是其右子節點值為 4 。

思路

一開始想的是直接和左右值比較,看是否符合對頂,但是忽略了隔層之間可能存在不符合規定的可能性,程式碼是

錯的

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def isValidBST(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        if root==None or (root.left==None and root.right==None):
            return True
        elif (root.left!=None and root.left.val>=root.val) or (root.right!=None and root.right.val<=root.val):
            return False
        else:
            return True if self.isValidBST(root.left) and self.isValidBST(root.right) else False

後面又想先遍歷到最後,然後把最大最小找出來,肯定在葉子節點嘛,然後再一層一層往上比較,但是不好實現啊,你都到最下面的葉子節點了,你要怎麼回去啊,所以最後也沒有寫出來這個程式碼。

最後參考了別人的程式碼,發現別人是從上往下比較的,將每個節點往左就是最大,往右就是最小值,太機智了。還有就是在傳輸過程中原函式不能夠傳遞最大最小值,又重新定義了一個函式呼叫,值得學習

程式碼是這樣的

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    
    def validBST(self,root,small,large):
        if root==None:
            return True
        if small>=root.val or large<=root.val:
            return False  
        return self.validBST(root.left,small,root.val) and self.validBST(root.right,root.val,large)
        
        
    def isValidBST(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        return self.validBST(root,-2**32,2**32-1)