给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
1.节点的左子树只包含小于当前节点的数。
2.节点的右子树只包含大于当前节点的数。
3.所有左子树和右子树自身必须也是二叉搜索树。
一刷:
这其实就是一个树的遍历问题,可以用递归或者中序遍历来解,两种解法的时间复杂度和空间复杂度都是O(n)
递归:
当往右子树遍历时,最大值变为当前节点,最小值不变,
当往左子树遍历时,最大值不变,最小值变为当前节点,
当前节点总是大于最小值,小于最大值。
class Solution:
def isValidBST(self, root: TreeNode, lower = float('-inf'),upper = float('inf'),) -> bool:
if root == None:
return True
else:
if root.val <= lower:
return False
elif root.val >= upper:
return False
else:
return self.isValidBST(root.right,lower = root.val,upper = upper) and self.isValidBST(root.left,lower = lower,upper = root.val)
中序遍历:
得到的序列总是升序序列
class Solution:
def isValidBST(self, root):
stack, inorder = [], float('-inf')
while stack or root:
while root:
stack.append(root)
root = root.left
root = stack.pop()
if root.val <= inorder:
return False
inorder = root.val
root = root.right
return True