层序遍历应用的是图中的广度优先遍历,不过效果是类似的:从树的根节点开始,从上到下、从左到右依次遍历每层的元素。
基础思路:使用队列来辅助遍历;当二叉树不为空时,将二叉树的根节点加入队列中;记录队列长度size,队列长度就是每层拥有的节点数(没理解的话请继续向下看),用来辅助我们进行循环;在这重复一下队列的性质:先进先出,元素只能加到队尾,只能从队头取出;当我们每取出一个节点,首先将该节点的值加入到临时数组中,然后判断该节点的左右节点是否存在,存在的话就再加入到队列中,因此,当上一层的节点遍历结束后,队列中剩余的所有元素都是本层节点,队列长度size就是本层所有结点的数量。当size为0时,临时数组中的所有元素就是所有本层节点的值。
基础代码如下:
let levelOrder = function(root,arr=[]){
if(root){//判断该二叉树是否为空
let queue = [root]//定义一个队列,使用队列辅助遍历
while(queue.length){//当队列中没有元素的时候停止遍历
let size = queue.length//定义每层的节点个数
let midArr= []//创建一个中间数组
while(size--){//每拿出一个节点,size就减一
let m = queue.shift()//拿出的节点
midArr.push(m.val)//将拿出的节点的值加入中间数组中
if(m.left)queue.push(m.left)//判断拿出节点的左节点是否为空,不为空则加入队列
if(m.right)queue.push(m.right)//作用同上,判断右节点
}
arr.push(midArr)//当每层的遍历结束后,将中间数组加入总数组中
}
}
return arr//返回总数组
}
通过这些基础代码,我们可以解决很多关于二叉树的问题。