98. 验证二叉搜索树

201 阅读1分钟

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。

题目链接: 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