题目:
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; };