题目:
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).
For example:
Given binary tree {3,9,20,#,#,15,7}
,
3
/ \
9 20
/ \
15 7
return its zigzag level order traversal as:
[
[3],
[20,9],
[15,7]
]
思路:
首先肯定的是要对树进行层序遍历,但是相邻两层的元素遍历顺序是相反的,因此传统的非递归遍历方法用一个队列肯定是无法实现。我们用两个栈来实现,同一层元素都在同一个栈中,相邻的两层元素放在不同的栈中,比如第一层元素放在第一个栈,那么第二层就放在第二个栈,第三层再放在第一个栈......如果某一层元素是从左往右遍历的,那么这层元素的孩子节点入栈顺序就是先左孩子后右孩子,相反如果某一层元素是从右往左遍历的,入栈顺序就是先右孩子后左孩子。
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number[][]}
*/
var zigzagLevelOrder = function(root) {
var res=[],tempres=[];
if(root==null){
return res;
}
var s1=[],s2=[];
s1.push(root);
var flag=true; while(s1.length!=0||s2.length!=0){
var p=null; if(flag){
p=s1.pop();
tempres.push(p.val);
if(p.left){
s2.push(p.left);
}
if(p.right){
s2.push(p.right);
}
if(s1.length==0){
var temp=[];
for(var i=0,len=tempres.length;i<len;i++){
temp[i]=tempres[i];
}
res.push(temp);
tempres.length=0;
flag=false;
}
}else{
p=s2.pop();
tempres.push(p.val);
if(p.right){
s1.push(p.right);
}
if(p.left){
s1.push(p.left);
}
if(s2.length==0){
var temp=[];
for(var i=0,len=tempres.length;i<len;i++){
temp[i]=tempres[i];
}
res.push(temp);
tempres.length=0;
flag=true;
}
}
} return res;
};