原以为只用输出一个普通数组,完了他要输出嵌套的数组,每一层一个小数组。这就要求要知道每个节点所在层数,于是哈希表是个不错的选择。
方法是在最简单的用队列对二叉树层序遍历方法上改进的,该方法这里不赘述了,直接说本题思路:主要的变量有两个:一个变量curArr保存当前层遍历的结果,一个变量curLevel保存当前层数。每往队列里加入一个节点,就要在哈希表里也加入该节点的层数信息,由此,每出队一个节点时,都能在表里找到它的层数,若其层数是当前遍历的层,则直接保存该节点value到curArr,反之,说明该节点是下一层的第一个节点,则需要做保存上一层结果、清空curArr、保存当前节点value、curLevel加一这四个重置操作。
var levelOrder = function(root) {
var map = new Map();
map.set(root, 1); //表中先放头节点及其层
let queue=[],res=[],curArr=[] //队列,结果数组,收集每一层数据的数组
if(root==null) return res
let curLevel=1 //开始遍历时层次为1
queue.unshift(root)
while(queue.length!=0){
let node=queue.pop()
if(map.get(node)==curLevel){ //若弹出节点属于当前层,加入到当前层的数组里
curArr.push(node.val)
}else{ //弹出节点不属于当前层,即已遍历到下一层了
res.push(curArr) //上一层收集好的数组放入结果中
curArr=[] //收集每层结果的数组清零
curArr.push(node.val) //放入新一层的第一个节点
curLevel+=1 //层数加一
}
if(node.left!=null) { //每入队一个节点,在哈希表中保存它的层数
queue.unshift(node.left)
map.set(node.left, curLevel+1)
}
if(node.right!=null) {
queue.unshift(node.right)
map.set(node.right, curLevel+1)
// console.log(map)
}
}
res.push(curArr) //最后一层的收集数组在while里未能入结果数组
return res
};
要注意的是,当最后一个节点走过if-else语句后,while循环结束,最后一层的小数组还未放进结果数组中,在循环外要push一下。