微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

HackerRank中“这是二叉搜索树”中的错误答案

如何解决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 举报,一经查实,本站将立刻删除。