使用单队列实现二叉树层序遍历:为何需要临时ArrayList?
为什么层序遍历需要临时集合
level? 这个临时的ArrayList<level>核心作用是按层级分组存储节点值,保证最终输出符合层序遍历的定义——每一层的节点值单独构成一个子列表,而不是把所有节点值平铺成一个一维列表。
举个直观的例子,假设我们有这样一棵二叉树:
1 / \ 2 3 / 4
- 如果直接把
head.val添加到result中,最终result会是:[1,2,3,4],这只是普通的广度优先遍历结果,完全丢失了「哪些节点属于同一层」的信息。 - 而用
level临时集合的话,最终result会是:[[1],[2,3],[4]],清晰地体现了层级结构:第一层只有节点1,第二层是节点2和3,第三层是节点4。
再结合代码逻辑来看:
- 外层
while循环的每一轮,对应处理二叉树的一层节点 - 每次进入
while循环时,queue.size()得到的就是当前层的节点总数 - 内层
for循环会遍历当前层的所有节点,把它们的值全部存入level集合 - 当当前层的所有节点处理完后,再把整个
level加入result,完成当前层的分组
另外,从方法的返回类型List<List<Integer>>也能看出来,设计意图就是要求返回嵌套列表——外层列表的每个元素都是对应一层的节点值列表,所以必须通过临时集合来收集每一层的元素,再统一加入结果集。如果直接添加单个值到result,不仅不符合返回类型要求,也完全违背了层序遍历「按层输出」的核心需求。
内容的提问来源于stack exchange,提问作者Mr.Frog
相关产品推荐
相关产品推荐

