题目:
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
思路1:
从题目名字"层序遍历"就能很容易联想到二叉树的广度优先遍历。题目要求二叉树的值按层级返回,那么我们遍历的时候以深度作为节点就行了。 每次遍历一层,将这一层的儿子节点储存到下一次遍历的数组中。直到数组为空。 代码如下:
var levelOrder = function(root) {
if(!root) return [];
let arr = [],list = [root];
while(list.length>0){
let currentArr=[],childArr=[];
for(let node of list){
if(!node) continue;
currentArr.push(node.val);
childArr.push(node.left);
childArr.push(node.right);
}
if(currentArr.length>0) arr.push(currentArr);
list = childArr;
}
return arr;
};
思路2:
这道题也可以通过深度优先遍历的方式解答。每次将深度level带入,存值的时候根据level不同,存在不通的数组内。 代码如下:
var levelOrder = function(root) {
let arr=[],level=0;
function levelSearch(root,level){
if(root==null) return;
if(arr[level]){
arr[level].push(root.val);
}else{
arr[level] = [root.val];
}
levelSearch(root.left,level+1);
levelSearch(root.right,level+1);
}
levelSearch(root,level);
return arr;
};
这里我是用递归实现的,也可以将每次要遍历的节点压入栈,通过栈的方式来实现。这里就不做演示了。