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] ]
confused what "{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,
* 第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
* 借助两个栈来实现。stack1保存当前正在打印层的结点,Stack2保存stack2正在打印出的结点的孩子结点。
* 当stack1为奇数层时则先放其左孩子,为偶数层时则先放其右孩子。
* 整个循环结束的条件是stack1为空。
/**
* 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,
* 第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
* 借助两个栈来实现。stack1保存当前正在打印层的结点,Stack2保存stack2正在打印出的结点的孩子结点。
* 当stack1为奇数层时则先放其左孩子,为偶数层时则先放其右孩子。
* 整个循环结束的条件是stack1为空。
*/
public List<List<Integer> > zigzagLevelOrder(TreeNode pRoot) {
List<List<Integer> > result = new ArrayList<List<Integer> >();
if(pRoot == null){
return result;
}
/*stack1保存当前正在打印层的结点,Stack2保存stack2正在打印出的结点的孩子结点。*/
Stack<TreeNode> stack1 = new Stack<TreeNode>();
Stack<TreeNode> stack2 = new Stack<TreeNode>();
ArrayList<Integer> list;
TreeNode node ;
boolean isEnven = false;//表示当前层是否为偶数层
/*初始化stack1为根结点*/
stack1.push(pRoot);
/*循环直到某一层需要打印的结点个数为0*/
while(!stack1.isEmpty()){
list = new ArrayList<Integer>();
/*循环打印出当前层的所有结点*/
while(!stack1.isEmpty()){
node = stack1.pop();
list.add(node.val);
if(isEnven){//偶数层则先放它的右孩子
if(node.right!=null){
stack2.add(node.right);
}
if(node.left!=null){
stack2.add(node.left);
}
}else{//奇数层先放它的左孩子
if(node.left!=null){
stack2.add(node.left);
}
if(node.right!=null){
stack2.add(node.right);
}
}
}//结束里层while循环
/*把当前层的打印结果加到之前的结果中*/
result.add(list);
stack1.addAll(stack2);
stack2.clear();
/*偶数层变奇数层,奇数层变偶数层*/
if(isEnven){
isEnven = false;
}else{
isEnven = true;
}
}
return result;
}