【树】Binary Tree Zigzag Level Order Traversal

题目:

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;
};