第一种(左到右的顺序打印)
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
题目
思路
按照同一层从左到右的顺序打印,因此使用广度优先遍历,先将同一层的遍历完,再遍历下一层的。要实现树的广度优先遍历策略,需要借助队列先进先出的特点,不然每次都还是会做成深度优先,树的左右节点性质就决定了每次会先遍历左节点
代码
var levelOrder = function(root) {
let res = [];
if(!root) {
return res;
}
// 初始化队列
let queue = [root]
// 跳出条件,队列为空,即所有节点都遍历完成
while(queue.length) {
// 拿出队首节点
let node = queue.shift();
res.push(node.val);
if(node.left) {
queue.push(node.left)
}
if(node.right) {
queue.push(node.right)
}
}
return res
};
第二种(每层打印到一行)
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
题目
思路
比起第一种,第二种最后输出是一个类似二维的数组,所以肯定是需要双重循环。在第二重循环里面需要定义一个变量,用来存放一层的数据。
代码
var levelOrder = function(root) {
let res =[]
if(!root){
return res
}
let queue = [];
queue.push(root)
while(queue.length>0){
let len=queue.length;
let tempArr = []
for(let i =0; i<len;i++){
let nodes = queue.shift()
tempArr.push(nodes.val);
if(nodes.left){
queue.push(nodes.left)
}
if(nodes.right){
queue.push(nodes.right)
}
}
res.push(tempArr);
}
return res
};
第三种(第一层由左到右第二层由右到左)
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
题目
思路
相比较第二种,就是将双层的level时数组进行倒序。
代码
var levelOrder = function(root) {
if (!root) return [];
let queue = [root];
let res = [];
let level = 0; // 代表当前层数
while (queue.length) {
res[level] = []; // 第level层的遍历结果
let levelNum = queue.length; // 第level层的节点数量
while (levelNum--) {
const front = queue.shift();
res[level].push(front.val);
if (front.left) queue.push(front.left);
if (front.right) queue.push(front.right);
}
// 行号是偶数时,翻转当前层的遍历结果
if (level%2) {
res[level].reverse();
}
level++;
}
return res;
};