描述
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
基本思想:
使用层序遍历的思想,再稍微做些修改。
首先使用一个变量flag标识遍历的方向
将每一层的节点存入一个数组arr中。
如果是从左向右遍历,则shift出来一个个节点保存它的值。推入孩子节点时使用push,并且先push左子节点,再push右子节点(因为接下来该从右向左了)
如果是从右向左遍历,则pop出来一个个节点保存它的值。推入子节点时使用unshift,并且先unshift右子节点,再unshift左子节点(因为接下来该从左向右了)
注:
shift是删除数组第一个元素,改变原数组,可保留删除节点的值;
pop是删除数组最后一个元素,改变原数组,可保留删除节点的值
/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
function Print(pRoot)
{
// write code here
//层序遍历
//主要思想:先把每一层节点入栈,然后再挨个遍历出来,让它的子节点入栈
if(!pRoot) return [];
const res = []; //存储结果,里面存放的对象是节点数组
const arr = []; //存放节点,
arr.push(pRoot);
//flag:作为一个标记,true从左向右,flase从右向左
let flag = true;
while(arr.length>0){
//每一层遍历完,都需要list数组重置,size也要重新赋值
let list = [];
let size = arr.length;
//size的设置是为了将每一层在数组中的节点遍历完毕,当它为0时,则意味着这一层的节点的孩子节点已经放入arr中,可以变换flag、并将list数组放入res中
while(size>0){
//定义一个空节点,来接收被删除的父节点
let node;
//从左到右遍历
if(flag){
//shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值,第一次:node是pRoot,此时arr数组为空
node = arr.shift();
if(node.left) arr.push(node.left);
if(node.right) arr.push(node.right);
}else{
//pop删除数组最后一个元素
node = arr.pop();
//将其孩子节点加入到数组,将新节点添加到数组开头
if(node.right) arr.unshift(node.right);
if(node.left) arr.unshift(node.left);
}
list.push(node.val);
size--;
}
flag = !flag;
res.push(list)
}
return res
}
module.exports = {
Print : Print
};