与HackerRAank有关的问题 - “树:这是二元搜索树吗?”https://www.hackerrank.com/challenges/ctci-is-binary-search-tree/problem
Challange将检查给定树是否为二叉搜索树 条件:左节点中的数据将小于root,右节点中的数据将更大,值不能等于root。 树不能包含重复 代码:
def check( root, min_number ,max_number):
if root == None or (root.left == None and root.right == None): #Check empty tree
return True
elif root.data <= root.left.data or root.right.data <= root.data: #+Check dup
return False
elif root.data <= int(min_number) or root.data >= int(max_number):
return False
elif root.right == None:
return root.left.data < root.data and check(root.left)
elif root.left == None:
return root.right.data > root.data and check(root.right)
else:
return check(root.left, int(min_number), root.data) and check(root.right, root.data, int(max_number))
def checkBST(root):
return check(root,0,10000)# const given
并非所有重复都被捕获。
测试用例(这只是一个例子):
2
1 2 3 4 6 8 10 11 12 13 14 15 16 16 18 19 21 21 22 23 24 25 26 27 78
答案应为否
任何关于我错过哪种情况的建议我错过了/需要调整什么?
答案 0 :(得分:1)
我认为你做得太多了,同时做得太少了。考虑一下这个片段:
elif root.data <= root.left.data or root.right.data <= root.data: #+Check dup
return False
现在考虑一下:
else:
return check(root.left, int(min_number), root.data) and check(root.right, root.data, int(max_number))
如果您要在第二个片段中进行递归,那么为什么您需要打扰&#34;达到&#34;进入孩子们进行比较的第一个片段?
另外,为什么偶尔会尝试将您的号码转换为int
? Aren你是否认为他们是一开始的整数?
我建议您减少代码量 - 摆脱不需要的int()
强制,并摆脱冗余的测试。相反,只关注当前节点上的 。最后,做出选择 - 你使用&lt; =和&gt; =或&lt;和&gt;比较?对所有测试都这样做,并确保适当调整参数。如果传入的最小值和最大值是包含参数,则使用&lt; =和&gt; =,并确保在递归时添加或减去一个。