不能靠一个迭代器同时支持深度优先和广度优先遍历,因为深度优先依赖栈(lifo)管理回溯路径,广度优先依赖队列(fifo)维持层级顺序,二者状态机制根本冲突;必须分别实现独立的dfs迭代器(用栈+左倾压栈策略)和bfs迭代器(用队列+逐层入队策略),并通过dfsiterator()与bfsiterator()方法分别暴露。

不能靠一个迭代器同时支持深度优先和广度优先遍历,因为两者状态管理机制根本不同:深度优先依赖栈(LIFO),广度优先依赖队列(FIFO)。必须为每种遍历方式单独实现对应的迭代器类。
深度优先迭代器:用栈模拟递归路径
核心是把“访问顺序”转化为栈中节点的压入/弹出节奏。以中序遍历为例:
- 构造时从根出发,一路向左将所有节点压栈,直到空节点——此时栈底是树最左下节点
- hasNext()只检查栈是否非空,不预计算下一个节点
- next()弹出栈顶节点并返回;若该节点有右子树,则立即对其右子树重复“一路向左压栈”操作
广度优先迭代器:用队列逐层推进
重点在于按层隔离访问节奏,避免下一层节点干扰当前层处理:
- 构造时仅将根节点入队
- hasNext()判断队列是否为空
- next()出队一个节点并返回;再将其左右非空子节点依次入队(保证从左到右、上到下)
- 不需要额外计数或分层标记,队列天然维持“先进先出”的层级顺序
如何让二叉树支持两种遍历方式
不要在同一个类里混写两种逻辑。推荐做法是提供两个独立的内部迭代器类,并通过不同方法暴露:
- 定义 dfsIterator() 方法,返回实现了 Iterator
的深度优先迭代器实例 - 定义 bfsIterator() 方法,返回另一个实现了 Iterator
的广度优先迭代器实例 - 用户按需调用:for (TreeNode n : tree.dfsIterator()) { ... } 或 for (TreeNode n : tree.bfsIterator()) { ... }
为什么不能复用同一个迭代器类
状态容器类型冲突是硬性限制:
- 栈结构决定了你总在处理“当前分支最深未访节点”,适合回溯式探索
- 队列结构决定了你总在处理“最早加入的待访节点”,适合横向铺开
- 强行在一个类里切换容器类型,会导致 hasNext()/next() 行为不可预测,违反迭代器契约










