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
你基本上是在问这两者之间有什么区别:
if not helper(node.right, node.val, upper):
return False
if not helper(node.left, lower, node.val):
return False
return True
和:
helper(node.right, node.val, upper)
helper(node.left, lower, node.val)
return True
第一个方法检查helper
调用的返回值并进行适当操作,如果子树不是BST则返回false。第二个检查子树,然后返回true。
__4__
/ \
2 8
/ \ / \
3 1 9 7
def level2():
return 42 # Returns '42'.
def level1():
level2() # Returns 'None', not '42'.
print(level1()) # Prints 'None'.
正确的方法将level2()
调用更改为return level2()
。
顺便说一下,我不确定您在这里从uper
和lower
得到了什么值。
有效性的递归定义意味着您唯一需要检查的是三个直接节点和子树。
def isValidBst(node):
# Empty tree is valid (or sub-tree, for that matter
# but, since we never descend into a null, that's a
# moot point).
if node is null: return true
# Check left value and sub-tree.
if node.left is not null:
if node.left.value >= node.value: return false
if not isValidBst(node.left): return false
# Check left value and sub-tree.
if node.right is not null:
if node.right.value <= node.value: return false
if not isValidBst(node.right): return false
# If there were no failures, including the possibility
# we're at a leaf node, everything below this node is
# okay.
return true
我的解决方案在第二个例子中失败了,我不知道为什么,请解释。 问题是: 给定一棵二叉树,确定它是否是有效的二叉查找树(BST)。 假设BST的定义如下: 节点的左子树只包含键小于节点键的节点。节点的右子树仅包含键大于节点键的节点。左子树和右子树都必须是二进制搜索树。 例1: 输入:[2,1,3] 输出:真 例2: 输入:[5,1,4,空,空,3,6] 输出:false 说明:根节点的值为5,但其右子
我试图验证二叉查找树。给定二叉树的根,确定它是否是有效的二叉查找树(BST)。 有效的BST定义如下: 节点的左子树只包含键小于节点键的节点。节点的右子树只包含键大于节点键的节点。左子树和右子树也必须是二叉搜索树。 https://leetcode.com/problems/validate-binary-search-tree/ 我正在使用递归解决方案,但它未能通过以下测试用例: 输入:[2,1
假设BST定义如下: 节点的左子树只包含键小于节点键的节点。节点的右子树只包含键大于节点键的节点。左子树和右子树也必须是二叉搜索树。 示例1:
我很难按我教授想要的格式打印出一个二叉搜索树。 他的格式是这样的: 我的代码:
一直在研究一些黑客等级破解编码面试问题,最近才发现这一个:二叉树问题。 在问题描述中,作者介绍了被认为是有效的二叉树的内容。 “节点左侧子树中每个节点的值都小于该节点的数据值。 然而他们提到这棵树 是有效的。但根据他们对有效二叉搜索树的描述,这棵树不是无效的吗,因为节点4有一个节点5的左子节点,后者更大。还是我误解了什么是有效的BST?
编写一个函数,如果给定的二叉搜索树包含给定的值,则返回1,否则返回0。 例如,对于以下树: N1(值:1,左:null,右:null) n2(值:2,左:n1,右:n3) N3(值:3,左:null,右:null) 对contains(&n2,3)的调用应返回1,因为根位于n2的树包含编号3。 函数应该返回1,然而,它返回0或者根本不返回。