给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:
示例 2:
低级做法,中序遍历,看看是否是有序的
1 # Definition for a binary tree node. 2 # class TreeNode: 3 # def __init__(self, x): 4 # self.val = x 5 # self.left = None 6 # self.right = None 7 8 class Solution: 9 def isValidBST(self, root: TreeNode) -> bool:10 res_ = []11 stack = []12 while root or stack:13 if root:14 stack.append(root)15 root = root.left16 else:17 root = stack.pop()18 res_.append(root.val)19 root = root.right20 stack=res_.copy()21 stack.sort()22 if len(set(stack)) != len(stack):23 return False24 return stack== res_25 26
执行用时 :68 ms, 在所有 Python3 提交中击败了73.22%的用户
内存消耗 :16.8 MB, 在所有 Python3 提交中击败了7.23%的用户
每次将当前值和上下界进行比较,递归对其左右子树进行该过程:
1 class Solution: 2 def isValidBST(self, root): 3 """ 4 :type root: TreeNode 5 :rtype: bool 6 """ 7 def helper(node, lower = float('-inf'), upper = float('inf')): 8 if not node: 9 return True10 11 val = node.val12 if val <= lower or val >= upper:13 return False14 15 if not helper(node.right, val, upper):16 return False17 if not helper(node.left, lower, val):18 return False19 return True20 21 return helper(root)
执行用时 :76 ms, 在所有 Python3 提交中击败了42.48%的用户
内存消耗 :16.2 MB, 在所有 Python3 提交中击败了39.06%的用