如何解决HackerRank中“这是二叉搜索树”中的错误答案
针对此挑战,我们将二叉树定义为具有以下排序要求的二叉搜索树:
节点左子树中每个节点的值小于该节点的数据值。 节点右子树中每个节点的值大于该节点的数据值。 给定二叉树的根节点,您能否确定它是否也是二叉搜索树?
在下面的编辑器中完成该函数,该函数具有参数:指向二叉树根的指针。它必须返回一个布尔值,该布尔值表示二叉树是否为二叉搜索树。您可能必须编写一个或多个辅助函数才能完成这一挑战。
输入格式
您不负责从stdin读取任何输入。隐藏的代码存根将组装一棵二叉树,并将其根节点作为参数传递给您的函数。
约束: 0
输出格式
您不负责将任何输出打印到stdout。如果树是二进制搜索树,则函数必须返回true;否则,返回0。否则,它必须返回false。隐藏的代码存根将在新行上以“是”或“否”答案打印此结果。
我的代码:
""" Node is defined as
class node:
def __init__(self,data):
self.data = data
self.left = None
self.right = None
"""
def check_binary_search_tree_(root):
if root is None or (root.left is None and root.right is None):
return True
if root.left.data>=root.data or root.right.data<=root.data:
return False
check_binary_search_tree_(root.left)
check_binary_search_tree_(root.right)
return True
我为什么会得到错误的答案?
解决方法
您的代码存在问题
-
首先你没有做
:return check_binary_search_tree_(root.left) and check_binary_search_tree_(root.right)
-
接下来,即使执行此操作,您也会忘记在检查BST属性中左右两个孩子时牢记根的值。可能是您的左孩子完全是一个良好的BST,但是当您考虑其父母时却不能成为BST。看下面的例子:
6 4 7 2 8
以4为根的子树是一个很好的BST,但是当您考虑其根值为6时会失败。
-
然后的解决方案是检查每个节点的值的正确范围,即
left_limit < root.data < right_limit
您可以将函数编写为:
def check_binary_search_tree_(root,min = -math.inf,max = math.inf):
if root is None:
return True
if root.data > min and root.data < max:
return check_binary_search_tree_(root.left,min,root.data) and check_binary_search_tree_(root.right,root.data,max)
return False
,
/
您不会返回这些递归函数的结果。尝试做:
/
有效的完整代码示例:
check_binary_search_tree_(root.left)
check_binary_search_tree_(root.right)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。