You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写Python递归生成器与迭代器?以二叉树迭代器为例

递归生成器实现二叉树__iter__方法

核心思路

递归生成器的关键是利用yield from语法,它可以直接迭代另一个生成器/可迭代对象,并把每个产出的值传递到当前生成器中。这样你就能像写普通递归遍历函数那样,把递归逻辑转化为生成器,完美适配__iter__的需求。

代码示例(中序遍历)

先定义基础的二叉树节点类,再实现递归生成器版的__iter__:

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class BinaryTree:
    def __init__(self, root=None):
        self.root = root
    
    # 递归生成器实现中序遍历的__iter__
    def __iter__(self):
        def inorder(node):
            if node:
                yield from inorder(node.left)
                yield node.val
                yield from inorder(node.right)
        return inorder(self.root)

为什么这样可行?

  • __iter__返回的是inorder(self.root)生成器对象,天然符合Python迭代器协议(生成器本身就是迭代器)。
  • 递归调用inorder(node.left)时,yield from会遍历左子树的生成器,把左子树的节点值依次产出;接着产出当前节点的值;最后再遍历右子树的生成器。整个过程完全遵循递归遍历的逻辑,不需要手动维护栈结构。

其他遍历方式的递归生成器实现

如果需要前序或后序遍历,只需调整yield和yield from的顺序:

前序遍历

def __iter__(self):
    def preorder(node):
        if node:
            yield node.val
            yield from preorder(node.left)
            yield from preorder(node.right)
    return preorder(self.root)

后序遍历

def __iter__(self):
    def postorder(node):
        if node:
            yield from postorder(node.left)
            yield from postorder(node.right)
            yield node.val
    return postorder(self.root)

什么时候用递归生成器?

当你的遍历逻辑用递归写更清晰(比如带过滤条件的遍历、复杂嵌套的树结构遍历),手动写非递归的栈维护会变得繁琐且容易出错时,递归生成器就是最优选择——代码简洁,逻辑和普通递归遍历完全一致,可读性极高。

内容的提问来源于stack exchange,提问作者wangjianyu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:42:24