【发布时间】:2021-12-14 21:23:25
【问题描述】:
我试图理解二进制函数is_bst 中的递归调用。该函数的目标是检查一棵树是否是二叉搜索树。请注意,这只是完整功能的摘录。我试图了解is_bst 函数中的这段代码is_bst_l, min_l, max_l = is_bst(node.left) 上发生了什么。 is_bst 函数返回 (True, None, None),我试图通过递归地遍历函数来弄清楚函数是如何得出返回值的。 is_bst 函数将来自 parse_tuple 函数的二叉树节点作为输入。例如,当我尝试在is_bst 函数之外解压缩这行代码is_bst_l, min_l, max_l = node.left 时,我得到TypeError: cannot unpack non-iterable TreeNode object,但在函数内部,我没有收到错误消息。我的问题是
- 在
is_bst函数中递归发生了什么。 - 如何在
is_bst函数中不获取解包类型错误。
#Tree Class
class TreeNode:
def __init__(self, key):
self.key = key
self.left = None
self.right = None
#function converts a turble to a binary tree
def parse_tuple(data):
# print(data)
if isinstance(data, tuple) and len(data) == 3:
node = TreeNode(data[1])
node.left = parse_tuple(data[0])
node.right = parse_tuple(data[2])
elif data is None:
node = None
else:
node = TreeNode(data)
return node
函数检查一棵树是否是二叉搜索树。
def remove_none(nums):
return [x for x in nums if x is not None]
def is_bst(node):
if node is None:
return True, None, None
is_bst_l, min_l, max_l = is_bst(node.left)
is_bst_r, min_r, max_r = is_bst(node.right)
is_bst_node = (is_bst_l and is_bst_r and
(max_l is None or node.key > max_l) and
(min_r is None or node.key < min_r))
# print('Minkey left: ', min_l, 'Nodekey :', node.key, 'Maxkey left: ',min_r)
# print('Minkey left: ', max_l, 'Nodekey :', node.key, 'Maxkey left: ',max_r)
min_key = min(remove_none([min_l, node.key, min_r]))
max_key = max(remove_none([max_l, node.key, max_r]))
# print(node.key, min_key, max_key, is_bst_node)
return is_bst_node, min_key, max_key
#函数调用
my_tuple= ((None,3,None),2,(None,5,None))
node = parse_tuple(my_tuple)
【问题讨论】:
-
它不是检查树是否是BST,你只是在遍历
-
@sahasrara62 是的,我明白,我只是想了解函数
is_bst中的递归调用。就像我在问题中提到的那样,is_bst只是完整的is_bst函数的摘录。 -
is_bst函数在哪里完成?只是预购遍历 -
@sahasrara62 我已经用完整的
is_bst函数更新了问题
标签: python recursion binary-tree binary-search-tree