我的代码是否为二进制搜索树,这是怎么回事?

时间:2019-07-14 12:29:21

标签: python python-3.x binary-tree binary-search-tree

我必须检查二叉树是否为二叉搜索树。这是我的代码,用于递归检查节点的键是否为
1)大于左侧子树的最大值
2)小于右侧子树的最小值

所有键都不同。
输入没问题,但是输入看起来像这样。
5
1 -1 1
2 -1 2
3 -1 3
4 -1 4
5 -1 -1
第一行包含顶点?的数量。树的顶点已编号 从0到-1。顶点0是根。 接下来的?行依次包含有关顶点0、1,...,?-1的信息。这些行中的每行都包含三个整数????,?????和???ℎ??-????是第ver个顶点的键,,是第?个顶点的左子元素的索引,???ℎ??是第ver个顶点的左子元素的索引。第个顶点。如果?没有 左或右子(或两者),相应的?????或???ℎ??(或两者)将等于-1。
约束:0≤?≤10 ^ 5; −2 ^ 31

class Tree:
   def read(self):
       self.n = int(sys.stdin.readline())
       self.key = [0 for i in range(self.n)]
       self.left = [0 for i in range(self.n)]
       self.right = [0 for i in range(self.n)]
       for i in range(self.n):
          [a, b, c] = map(int, sys.stdin.readline().split())
          self.key[i] = a
          self.left[i] = b
          self.right[i] = c
          return self.n

    def isBinarySearchTree(self,index=0):
        leftIndex=self.left[index]
        rightIndex=self.right[index]
        key=self.key[index]
        if leftIndex==-1 and rightIndex==-1:
            return key,key,True

        if leftIndex!=-1:
            left=self.isBinarySearchTree(self.left[index])
            leftMin=left[0]
            leftMax=left[1]
            leftbool=left[2]

        if rightIndex!=-1:
            right=self.isBinarySearchTree(self.right[index])
            rightMin=right[0]
            rightMax=right[1]
            rightbool=right[2]

        if leftIndex==-1:
            return min(key,rightMin), rightMax, key<=rightMin and rightbool

        elif rightIndex==-1:
            return leftMin, max(key,leftMax), key>=leftMax and leftbool

        else:
            return min(key,leftMin), max(key,rightMax), key>leftMax and key<rightMin and leftbool and rightbool  
def main():
    tree = Tree()
    n=tree.read()
    if n==0 or tree.isBinarySearchTree()[2]:
        print("CORRECT")
    else:
        print("INCORRECT")

这是在线课程的一部分,我通过了所有提到的测试用例,但是它在测试器中显示了错误的答案,所以我不知道错误的用例。

您能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:-2)

显然,问题只是堆栈溢出。我用这个来处理。

import sys, threading

sys.setrecursionlimit(10**7) # max depth of recursion
threading.stack_size(2**27)  # new thread will get stack of such size

*above code*

threading.Thread(target=main).start()

增加堆栈大小解决了溢出问题。