使用Python生成器获取二叉树叶节点值并转为列表的问题
代码问题说明
你代码存在三处核心错误:
- 递归调用生成器没有加
yield from:生成器函数调用后返回的是生成器对象,不会自动执行内部迭代,必须用yield from才能把子生成器的元素传递到上层 - 空节点逻辑多余:
if not root: yield会产出无意义的None值,直接删除这段即可,空节点不需要产出任何内容 - 生成器遍历逻辑错误:
for i in a已经在逐个取出生成器的元素,内部再调用next(a)会跳过一半元素;且最后你返回的是生成器对象而非组装好的列表,自然得不到预期结果
修正后代码
def leaves_list(self): def find(root): # 空节点直接结束,不产出任何值 if not root: return # 匹配叶子节点,产出节点值 if not root.left and not root.right: yield root.data # 递归遍历左子树,用yield from接收子生成器的产出 if root.left: yield from find(root.left) # 递归遍历右子树 if root.right: yield from find(root.right) # 直接把生成器转为列表返回,无需手动循环追加元素 return list(find(self.root))
运行你提供的测试代码,输出结果为预期的[5, 1, 8, 4]。如果你需要返回生成器而非列表,仅需把最后一行改为return find(self.root),调用方再自行转列表即可。
内容的提问来源于stack exchange,提问作者xander
相关产品推荐
相关产品推荐

