HackerRank:检查二进制搜索树:Python -test case -for duplicatelications

时间:2017-10-09 16:31:10

标签: python binary-search-tree testcase

与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

答案应为否

任何关于我错过哪种情况的建议我错过了/需要调整什么?

1 个答案:

答案 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; =,并确保在递归时添加或减去一个。