【LeetCode】【Python】驗證二叉搜尋樹
阿新 • • 發佈:2018-12-24
題目
給定一個二叉樹,判斷其是否是一個有效的二叉搜尋樹。
一個二叉搜尋樹具有如下特徵:
- 節點的左子樹只包含小於當前節點的數。
- 節點的右子樹只包含大於當前節點的數。
- 所有左子樹和右子樹自身必須也是二叉搜尋樹。
示例 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)