给定一个二叉树,判断它是否是有效的二叉搜索树(BST)。
假设BST定义如下:
节点的左子树只包含键值小于节点键值的节点。 节点的右子树只包含键值大于节点键值的节点。 左右子树都必须是二叉搜索树。
Example 1:
2
/ \
1 3
Input: [2,1,3]
Output: true
Example 2:
5
/ \
1 4
/ \
3 6
Input: [5,1,4,null,null,3,6]
Output: false
Explanation: The root node's value is 5 but its right child's value is 4.
我的代码:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
def helper(node, lower = float('-inf'), upper = float('inf')):
if(not node):
return True
if(node.val<=lower or node.val>=upper):
return False
if not helper(node.right, node.val, upper):
return False
if not helper(node.left, lower, node.val):
return False
return True
return helper(root)
上述代码对于所有测试案例都有效,然而下面的代码却不行。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
def helper(node, lower = float('-inf'), upper = float('inf')):
if(not node):
return True
if(node.val<=lower or node.val>=upper):
return False
helper(node.right, node.val, upper)
helper(node.left, lower, node.val)
return True
return helper(root)
额外的 IF 条件的需要是什么?即使没有它们,下面的 if 条件语句应该也会从中返回 false,对吗?我在这里漏掉了什么?
if(node.val<=lower or node.val>=upper):
return False
helper
重命名为is_subtree_within_bounds
可以帮助理解正在发生的事情。 - rdas