验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xn08xg/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
def isValidBST2(root: TreeNode,maxValue:int,minValue:int):
if root==None:
return True
if root.val <= minValue or root.val >= maxValue:
return False
else:
return isValidBST2(root.left,root.val,minValue) and isValidBST2(root.right,maxValue,root.val)
return isValidBST2(root, 2**32,-2**32);
如果一个结点是空的,我们默认他是有效的二叉搜索树。
否则如果左节点不为空,我们要判断是否大于左节点的值。
如果右节点不为空,我们还要判断小于右节点的值。
然后我们再以左右两个子节点用相同的方式判断。看起来好像没什么问题,但我们好像忽略了一个每个节点的上限和下限,比如下面这棵树
注意6这个节点不光要小于15而且还要大于10,所以这里的每一个节点都是有一个范围的,上面的代码我只判断了6比15小,但没有和10进行比较,所以代码是错误的。这里我们来给每个节点添加一个范围,如果不在这个范围之内直接返回false,比如6的范围是(10,15),很明显他不在这个范围内,所以他不是二叉搜索树。根节点的范围我们从Long.MIN_VALUE到Long.MAX_VALUE,来看下代码
public boolean isValidBST(TreeNode root) {
return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
public boolean isValidBST(TreeNode root, long minVal, long maxVal) {
if (root == null)
return true;
//每个节点如果超过这个范围,直接返回false
if (root.val >= maxVal || root.val <= minVal)
return false;
//这里再分别以左右两个子节点分别判断,
//左子树范围的最小值是minVal,最大值是当前节点的值,也就是root的值,因为左子树的值要比当前节点小
//右子数范围的最大值是maxVal,最小值是当前节点的值,也就是root的值,因为右子树的值要比当前节点大
return isValidBST(root.left, minVal, root.val) && isValidBST(root.right, root.val, maxVal);
}
看下运行结果
作者:数据结构和算法
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xn08xg/?discussion=69ga70
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。