題目分析:
給定一個二叉樹,判斷其是否是一個有效的二叉搜索樹。
假設一個二叉搜索樹具有如下特徵:
- 節點的左子樹只包含小於當前節點的數。
- 節點的右子樹只包含大於當前節點的數。
- 所有左子樹和右子樹自身必須也是二叉搜索樹。
示例 1:
輸出: true
示例 2:
解題思路:
初看這一題是懵逼的,經過評論區的提醒發現核心就四個字:中序遍歷,對於一個搜索樹中序遍歷爲升序,這樣我們就可以把問題轉化爲兩個簡單的問題,(1)中序遍歷(2)結果是否爲升序。由於中序遍歷有兩種方法,故本題也提供兩種解法
- 中序遍歷我們有兩種方法,遞歸或者棧,詳見【LeetCode】94. Binary Tree Inorder Traversal
- 結果是否爲升序我們並不用全部遍歷,只要出現了某個元素比前面的小,我們就知道該返回False了
- 代碼理解困難可以反覆設置斷點調試或者參考【LeetCode】94. Binary Tree Inorder Traversal
提交代碼1:(遞歸,Runtime: 56 ms, faster than 53.14% )
class Solution:
def isValidBST(self, root: 'TreeNode') -> bool:
res = []
self.last_val = -2147483649
self.flag = True
def pre_order(tree):
if tree == None:
return
pre_order(tree.left)
if tree.val != None:
if tree.val <= self.last_val:
self.flag = False
self.last_val = tree.val
if self.flag:
pre_order(tree.right)
pre_order(root)
return self.flag
提交代碼2:(棧,Runtime: 52 ms, faster than 88.30% )
class Solution:
def isValidBST(self, root: 'TreeNode') -> 'bool':
if root is None:
return True
stack = []
maximum = -2147483649
while stack or root:
while root and root.val != None:
stack.append(root)
root = root.left
root = stack.pop()
if root.val is None:
continue
if root.val <= maximum:
return False
maximum = root.val
root = root.right
return True