java中iterator不直接支持树遍历,但可通过自定义实现dfs(栈)或bfs(队列)遍历;如前序遍历用栈压入右、左子节点,层序遍历用队列;还可扩展支持中序、后序等,结合iterable可直接for-each。

Java 中的 Iterator 本身不直接支持树形结构遍历,但你可以通过自定义迭代器实现树的深度优先(DFS)或广度优先(BFS)遍历。核心思路是:把树的遍历逻辑封装进一个类,让它实现 Iterator<t></t> 接口,内部用栈(DFS)或队列(BFS)管理待访问节点。
用栈实现前序遍历的 Iterator(DFS)
这是最常见的方式,模拟递归的调用栈,按“根→左→右”顺序返回节点值。
- 构造时将根节点压入栈中
-
hasNext()判断栈是否为空 -
next()弹出栈顶节点,将其右子节点、左子节点依次入栈(注意顺序,保证左先于右被处理)
示例(二叉树节点定义简写):
class TreeNode { int val; TreeNode left, right; }class TreeIterator implements Iterator
private final Stack
TreeIterator(TreeNode root) { if (root != null) stack.push(root); }
public boolean hasNext() { return !stack.isEmpty(); }
public Integer next() {
TreeNode node = stack.pop();
if (node.right != null) stack.push(node.right);
if (node.left != null) stack.push(node.left);
return node.val;
}
}
用队列实现层序遍历的 Iterator(BFS)
适合需要按层级顺序访问的场景,比如打印树的每一层。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 使用
LinkedList或ArrayDeque模拟队列 - 初始化时将根节点加入队列
-
next()取出队首节点,并将其左右子节点(非空)加入队尾
支持多种遍历方式的通用设计
可以定义枚举 TraversalType { PRE_ORDER, IN_ORDER, POST_ORDER, LEVEL_ORDER },在迭代器构造时传入类型,内部根据类型切换状态机或数据结构。中序/后序遍历需更精细控制(例如中序需一路向左到底再回溯),常用辅助栈记录“已访问但未产出”的节点。
注意:中序和后序的 Iterator 实现不能简单靠入栈顺序,必须模拟完整的递归过程——比如中序可先将路径上所有左节点压栈,每次 next() 弹一个,再转向其右子树并重复压左。
结合 Iterable 让树对象可 for-each
让树的根节点或树容器类实现 Iterable<t></t>,返回自定义迭代器实例,就能直接使用增强 for 循环:
private TreeNode root;
public Iterator
}
// 使用:
for (int val : tree) { System.out.println(val); }
不复杂但容易忽略的是:Iterator 要求线程不安全、单次遍历、且 remove() 方法通常抛 UnsupportedOperationException(除非你明确支持删除)。实际开发中,优先考虑使用 Java 8+ 的 Stream API 配合递归方法生成流,更简洁;但理解自定义 Iterator 原理对掌握遍历本质很有帮助。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










