私有非静态内部类实现节点迭代器,封装遍历逻辑并隔离状态,对外仅暴露标准Iterator<T>接口。中序用栈、层序用队列、深度优先用函数式子节点获取,每次iterator()返回独立实例,确保线程安全与零修改替换。

在复杂树形结构中,用私有非静态内部类定义节点迭代器,核心是把遍历逻辑“收进树内部”,对外只留标准 Iterator<T> 接口。用户调用 tree.iterator() 时,完全不感知是前序、中序还是广度优先——这些细节全由内部类封装。
为什么必须用私有非静态内部类
这是实现真正封装的关键组合:
-
非静态 → 自动持有外部树实例引用,可直接读取根节点
root、节点计数size、或自定义缓存字段,无需暴露 getter - 私有 → 外部代码既不能 new 它,也不能继承或反射访问,杜绝绕过容器直接操作节点的风险
-
无公开构造器 → 迭代器只能通过树的
public Iterator<T> iterator()获取,控制权始终在树手里
如何为不同遍历策略设计独立内部类
一棵树常需支持多种遍历方式,每种都应有专属内部类,避免逻辑混杂:
-
中序迭代器:用栈预存最左路径,
next()弹出后立即压入右子树的最左链 -
层序迭代器:用队列(如
LinkedList<Node>),每次取头结点并把其子节点加到队尾 -
深度优先(泛化)迭代器:接收一个
Function<Node, List<Node>>来动态获取子节点,适配多叉树或图结构
命名要明确,比如 private final class InOrderIterator implements Iterator<T>,不叫 TreeIterator 这类模糊名称。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
状态隔离与线程安全基础
每次调用 iterator() 都返回新实例,确保遍历状态互不干扰:
- 每个内部类自己维护游标,如
private Node current、private Queue<Node> queue或private Stack<Node> stack - 外部树类不保存任何遍历相关字段,
hasNext()和next()完全依赖内部状态驱动 - 两个线程同时调用
tree.iterator(),得到的是彼此独立的栈/队列实例,天然支持并发遍历
对外只暴露 Iterator 接口契约
用户看到的永远只是:
-
boolean hasNext()—— 不透露是查栈空、队列空,还是递归结束标志 -
T next()—— 不暴露是取node.data、计算中间值,还是从缓存数组加载 - 不提供
reset()、peek()等扩展方法,严格遵循 JDK 规范,保持接口干净
这样,日后把二叉树换成 B+ 树或跳表,只需重写内部类逻辑,所有调用方代码零修改。

















