能否用yield获取嵌套函数全部结果?我的BST验证代码始终返回True求助
问题分析与解决
你的代码有这几个问题
- 函数调用写错了:最后打印的是
is_BST函数本身,不是执行结果,得写成print(is_BST());而且is_BST没定义参数,直接用全局变量root,建议改成把root作为参数传进去。 - 递归生成器没传递结果:在
is_BST1里递归调用自己时,没加yield from,导致递归里的yield输出传不到上层,all()根本捕获不到那些错误结果。 - BST验证逻辑不对:你只检查了直接子节点和当前节点的大小,但有效BST要求整个左子树所有节点都比当前节点小,整个右子树所有节点都比当前节点大——比如左子树的右节点如果比根节点大,你的代码查不出来。
- yield逻辑不全:只有左子节点不存在时才
yield True,如果左右子节点都存在且符合直接大小,函数没任何输出,all()碰到空迭代器会返回True,这就是为啥你的代码总是返回True。
修复后的代码示例
下面是修正了递归生成器问题,同时补全BST验证逻辑的版本:
class TreeNode(object): def __init__(self, x): self.val = x self.left = None self.right = None def is_BST(root): if not root: return True return all(is_BST_valid(root, float('-inf'), float('inf'))) def is_BST_valid(curnode, lower, upper): # 先检查当前节点是否在合法范围内 if not (lower < curnode.val < upper): yield False return # 递归检查右子树,把下界设为当前节点值 if curnode.right: yield from is_BST_valid(curnode.right, curnode.val, upper) # 递归检查左子树,把上界设为当前节点值 if curnode.left: yield from is_BST_valid(curnode.left, lower, curnode.val) # 所有检查通过,返回True yield True # 测试用例:创建一个无效BST root = TreeNode(5) root.left = TreeNode(3) root.left.right = TreeNode(6) # 这个节点值6大于根节点5,属于无效情况 root.right = TreeNode(7) print(is_BST(root)) # 输出False,符合预期
关于用yield获取嵌套函数结果的问题
当然可以,用yield from语法就行。在递归的生成器函数里,当你调用另一个生成器(比如递归调用自身)时,yield from 生成器会把嵌套生成器的所有yield结果逐个传递到上层,这样上层的all()或者其他迭代器就能拿到所有递归产生的结果。
内容的提问来源于stack exchange,提问作者fond bcn
相关产品推荐
相关产品推荐

