给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。
题目链接: leetcode-cn.com/problems/va…
解题思路:递归
遇事不决先递归,首先确定需求
先画一个树,确定每个位置的取值范围
这样确定一下就很清楚了
我们每个子节点都有一个判断的范围,而这个范围都可以从他的父节点取到
设一个二叉树的根root的取之范围是min到max
先定义一个方法,当节点为空时开始往上
def helper(root, min, max):
if root is None:
return True
就有了基本的判断
if root.val >= max:
return False
if root.val <= min:
return False
他的左节点取值范围就是min到root.val
所以验证左子树的方法就是
helper(root.left,min, root.val)
右节点的取值范围是root.val到max
所以验证右子树的方法就是
helper(root.left, root.val, max)
根节点的取值范围是无穷小到无穷大,我们就用None代替
所以前面的判断就要加上是否是正无穷的判断
把写好的东西组装一下就是
def helper(self, root, max, min):
if root is None:
return True
if max is not None:
if root.val >= max:
return False
if min is not None:
if root.val <= min:
return False
if self.helper(root.left, root.val, min) and self.helper(root.right, max, root.val):
return True
else:
return False