树遍历中记录每个节点深度的关键是队列中同步存储节点指针与对应深度值;仅靠while循环次数无法为每个节点精确标记深度,必须在入队时显式携带depth,如(node, d),子节点以d+1入队,确保访问时深度可用。

树遍历中记录每个节点的深度,关键在于**队列中不仅存节点指针,还要同步携带其深度值**。单纯用全局变量或递归参数在BFS里不可靠,必须让每层入队时明确标出“这个节点属于第几层”。
为什么不能只靠循环次数推深度
仅靠外层 while 循环次数判断深度,适用于标准层序输出(如每层一个列表),但一旦需要为每个节点单独标记深度——比如构建带 depth 字段的结构体、筛选某深度的节点、计算节点到根距离——就必须在入队时把深度作为元数据一并保存。
队列元素需封装节点+深度
实际操作中,队列存储的不是裸指针,而是成对数据。常见方式有:
- 自定义结构体/元组:如 (node, depth),Python 用 tuple,Go 用 struct,Java 用内部类或 Pair
- 双队列并行:一个存节点,一个存对应 depth,保持索引严格对齐(简单但略冗余)
- 单队列存节点,另用数组或 map 记录 node → depth 映射(适合已知节点可哈希或编号固定)
标准 BFS 中深度随层推进更新
根节点 depth = 0,每次从队列取出 (node, d),访问后将其子节点以 d+1 深度入队:
- 左子非空 → 入队 (node.Left, d + 1)
- 右子非空 → 入队 (node.Right, d + 1)
- 这样每个节点入队时,它的深度就已确定,后续访问可直接使用
典型应用场景示例
求最大深度:不依赖递归,只需在出队时更新 maxDepth = max(maxDepth, d);
按深度分组输出:遇到新 depth 值时新建子列表,否则追加到当前层列表;
找最深叶节点:只在 node 为叶子且 d > currentMax 时更新结果。

















