描述
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
数据范围:0 \le n \le 15000≤n≤1500,树上每个节点的val满足 |val| <= 100∣val∣<=100
要求:空间复杂度:O(n)O(n),时间复杂度:O(n)O(n)
例如:
给定的二叉树是{1,2,3,#,#,4,5}
该二叉树之字形层序遍历的结果是
[
[1],
[3,2],
[4,5]
]
示例1
输入:
{1,2,3,#,#,4,5}
复制返回值:
[[1],[3,2],[4,5]]
复制说明:
如题面解释,第一层是根节点,从左到右打印结果,第二层从右到左,第三层从左到右。
示例2
输入:
{8,6,10,5,7,9,11}
复制返回值:
[[8],[10,6],[5,7,9,11]]
复制
示例3
输入:
{1,2,3,4,5}
复制返回值:
[[1],[3,2],[4,5]]
解题: 层次遍历
/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
function Print(pRoot)
{
//判断树是否为空
if(pRoot===null){
return null
}
//这个用来存放奇数层
var stack1=[pRoot]
//这个用来存放偶数层
var stack2=[]
//这个用来存放结果
var stack3=[]
//这个用来代表第几层
var stack4=1
//这里的判断是我们的奇数层和偶数层是否有数据,当没事数据时就不再执行
while(stack1.length || stack2.length){
//层次遍历的话主要的思路就是建立两个数组
//模仿栈内存先进后出的原则
//首先我们先判断是
//处理奇数层 ,这里使用的时取余的操作
//然后进到里面去,以我们的奇数层是都有数据进行判断,如果有那么就往下找我们的子节点,添加到偶数层数组中
//最后再添加到我们的结果数组中,最后要代表第几层++
if(stack4 % 2 !==0){
let temp = [];
while(stack1.length){
let node=stack1.pop()
if(node !==null){
temp.push(node.val)
stack2.push(node.left)
stack2.push(node.right)
}
}
if(temp.length){
stack3.push(temp)
stack4++
}
}else{
let temp=[]
while(stack2.length){
let node=stack2.pop()
while(node !==null){
temp.push(node.val)//这个是获取当前节点本身的值
stack1.push(node.left)//这个是添加下一层奇数的节点
stack1.push(node.right)
}
}
if(temp.length){
stack3.push(temp)
stack4++
}
}
}
return stack3
// write code here
}
module.exports = {
Print : Print
};
主要的思路就是两个数组,轮流来添加和pop拿出值