我不熟悉如何通过Python中的递归函数调用冒泡回调。在这个例子中,我写了一个'检查某些东西是否是二叉树方法'必须返回true或false。但是,如果我从另一个函数调用它(即使我点击我的条件)我将不会返回False。
如何确保此次回复最终完成?
def isValidTree(root, tempArr):
if(root.left):
return isValidTree(root.left, tempArr)
if(len(tempArr) == 0):
tempArr.append(root.data)
elif(tempArr[len(tempArr) - 1] >= root.data):
return False
else:
tempArr.append(root.data)
if(root.right):
return isValidTree(root.right, tempArr)
def isBinarySearchTree(root):
print(isValidTree(root, []))
答案 0 :(得分:1)
您应该检查递归调用是否返回False,而不是仅仅将递归调用的结果返回给isValidTree(root.left)
和isValidTree(root.right)
,并且在这种情况下将False结果传播给调用者。此外,如果没有遇到错误,您应该返回True:
def isValidTree(root, tempArr):
if root.left:
if not isValidTree(root.left, tempArr):
# Propagate error in left subtree to the parent.
return False
if len(tempArr) == 0:
tempArr.append(root.data)
elif tempArr[len(tempArr) - 1] >= root.data:
return False
else:
tempArr.append(root.data)
if root.right:
if not isValidTree(root.right, tempArr):
# Propagate error in right subtree to the parent.
return False
# No errors encountered, so it was valid.
return True
答案 1 :(得分:1)
当您遍历树时,您的代码的结构方式应该返回的值True
或False
以指示子树的有效性。正如@Vasif所说,您将返回string
或None
,这不是您想要的。
您需要首先测试基本情况 Am I at a leaf?
我不确定你在使用tempArr做什么,但我会留下它。
def is_bst_tree(treenode, temp_arr):
if treenode.isempty(): # this should be a method on your treenode data type
return True
# do the check of the curent value
# based on being on the left or right
# side of tree
# return False # this should be done after you have made the relevant checks
return is_bst_tree(treenode.right,temp_arr) and is_bst_tree(treenode.left, temp_arr)
"冒泡"将根据检查或您在叶子的事实从函数末尾的递归调用发生。
您将留下boolean and ... and boolean
链,该链将解析为True
或False
。
您可以从https://en.wikipedia.org/wiki/Binary_search_tree#Verification调整算法 有关最小值和最大值,请参阅Maximum and Minimum values for ints