迭代协议实现组件树dfs需手动维护栈模拟递归,避免栈溢出并控制访问节奏;初始化推入根节点,循环弹出处理、再从右往左压入子节点以保证左先访;简易迭代器返回含next()的对象,内部用数组栈实现。

关键点:用栈管理“下一步该访问谁”
深度优先的本质是“一条路走到黑,走不通再回头”。迭代实现时,栈就承担了“记住回头位置”的角色——每次压入的是待探索的子节点,弹出的是当前要处理的节点。
基础步骤(以通用组件树为例)
假设每个组件对象有 children 属性(数组),且支持 Symbol.iterator 协议:
- 初始化一个栈,把根组件推入
- 循环直到栈为空:
→ 弹出栈顶组件
→ 输出/处理该组件
→ 将其 children 从右往左依次压入栈(保证左子树先被弹出)
为什么子节点要“右→左”入栈?
因为栈是后进先出(LIFO)。如果想让左子树比右子树先被访问(符合常规 DFS 习惯),就得先把右子树压进去,再压左子树。例如根有 [A, B] 两个子组件,按顺序 push(A), push(B),弹出时是 B 先出;而 push(B), push(A) 后,A 先出。
可直接使用的简易迭代器结构
不依赖语言内置迭代器,只需返回一个含 next() 方法的对象:
-
next() 返回
{ value: component, done: false }或{ done: true } - 内部用数组模拟栈,
push()/pop()操作即可 - 首次调用 next() 处理根节点,后续每次调用推进一层深度











