持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情
二叉树的层次遍历
二叉树的层次遍历就是逐层,从左右到右访问所有节点。例如下图这棵二叉树
遍历后的结果是[[6],[3,7],[2,5,8]]。
概念并不难理解,对于这种遍历方式,我们需要借助辅助队列来实现。队列具有先入先出的特性,符合层次遍历中一层一层遍历的逻辑。
下面是层次遍历的代码:
var levelOrder = function(root) {
let res=[],queue=[];
queue.push(root);
if(root===null){
return res;
}
while(queue.length!==0){
let length=queue.length;
let curLevel=[];
for(let i=0;i<length;i++){
let node=queue.shift();
curLevel.push(node.val);
node.left&&queue.push(node.left);
node.right&&queue.push(node.right);
}
res.push(curLevel);
}
return res;
};
上面的程序定义了两个数组一个数组用来存放结果一个数组用来模拟队列。首先将根节点push进队列中,判断根结点是否为空,如果空的话直接返回空数组为结果就可以了。
接下来进入遍历的循环,这个循环会将二叉树全部遍历结束。首先设置一个变量,用来记录当前层级的节点数,这个变量便于实现每层的循环。接下来定义一个临时数组,存放每一层的节点。
之后便是程序的主要逻辑,每一层不断将队列头部的元素取出放入临时数组中,再将节点的左孩子节点和右孩子节点push进队列中,一层循环结束后,将临时数组push进结果数组中。最后返回结果数组就可以啦。
总结
二叉树的层序遍历并不困难,主要是注意什么时候进入哪个循环。还有就是因为每遍历一个节点,都会将他的左孩子和右孩子push进队列中,所以当一层循环结束后,队列里剩下的是下一层的节点,这样可以将所有的节点都遍历到。