问题描述
针对此挑战,我们将二叉树定义为具有以下排序要求的二叉搜索树:
节点左子树中每个节点的值小于该节点的数据值。 节点右子树中每个节点的值大于该节点的数据值。 给定二叉树的根节点,您能否确定它是否也是二叉搜索树?
在下面的编辑器中完成该函数,该函数具有参数:指向二叉树根的指针。它必须返回一个布尔值,该布尔值表示二叉树是否为二叉搜索树。您可能必须编写一个或多个辅助函数才能完成这一挑战。
输入格式
您不负责从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)