递归是遍历树形结构最自然的方式,核心在于每个节点处理逻辑与整棵树一致,需明确终止条件(如节点为null)、单层处理逻辑(如收集值)、逐个递归子节点,天然实现深度优先遍历。

递归是遍历树形结构最自然的方式,核心在于:每个节点的处理逻辑和整棵树一致,只需对子节点重复调用自身。
明确递归终止条件
树遍历中,递归必须有明确的“到底”判断,否则会无限调用导致栈溢出。通常以节点是否为 null 或是否没有子节点(如 children 为空数组)为边界。
- 若节点为 null 或 undefined,直接返回,不继续递归
- 若使用数组表示子节点(如
node.children),检查该数组是否存在且长度大于 0 - 避免仅靠
node.children存在性判断——有些数据中该字段可能为 null 而非 []
设计单层处理逻辑
先想清楚“当前这个节点我要做什么”,比如收集值、修改属性、触发回调等,再把子节点交给递归处理。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 常见操作:将当前节点的
id或name推入结果数组 - 支持传入回调函数,在每层进入时执行自定义逻辑(如权限校验、懒加载标记)
- 注意副作用控制——如果修改原树结构,需确认是否符合预期;如需无损遍历,可考虑深拷贝或只读访问
正确递归调用子节点
子节点通常是数组,需逐个遍历并递归调用。不能直接传整个数组给递归函数(除非函数签名专门支持),而是对每个子项调用自身。
立即学习“Java免费学习笔记(深入)”;
- 用
for...of或forEach遍历node.children - 每次递归传入的是单个子节点对象,不是数组
- 若树是多叉但结构不统一(例如有的节点用
children,有的用subs),建议提前标准化或在递归前做字段映射
区分深度优先与广度优先(递归天然适合 DFS)
纯递归默认实现的是深度优先遍历(DFS)。想实现广度优先(BFS),应改用队列迭代,而非递归。
- DFS 示例:先处理根,再递归处理第一个子树,直到叶子,再回溯处理兄弟节点
- 如果业务需要 BFS 效果(如逐层高亮),不要强行用递归模拟——容易混乱且无优势
- 递归 + 层级参数(如
depth)可辅助记录层级信息,用于缩进、权限深度限制等场景

















