一、问题描述
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] ]
二、问题分析
遍历每一层结点时都是从左往右存储,只是在读取结点值时,有的层是从后往前读取(借助flag标志位)。
三、算法代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if(root == null){
return result;
}
LinkedList<TreeNode> pre = new LinkedList<TreeNode>();//保存树中pre层树结点
pre.add(root);
int preLength = 0;
LinkedList<TreeNode> cur = null;//保存树中当前层树结点
List<Integer> curValue = null;//保存树的当前层树节点中数值
TreeNode curNode = null;
boolean flag = true;
while(pre.size() != 0){
preLength = pre.size();
cur = new LinkedList<TreeNode>();
curValue = new ArrayList<Integer>();
if(flag){//从前往后访问,使得下层结点顺序为从左到右的顺序
for(int i = 0; i <= preLength - 1; i++){
curNode = pre.get(i);
curValue.add(curNode.val);//保存树的当前层树节点中数值
if(curNode.left != null){
cur.add(curNode.left);
}
if(curNode.right != null){
cur.add(curNode.right);
}
}
result.add(curValue);
pre = cur;
flag = false;
}else{//虽然从后往前访问,但使用addFirst方法使得下层结点顺序为从左到右的顺序
for(int i = preLength - 1; i >= 0 ; i--){
curNode = pre.get(i);
curValue.add(curNode.val);//保存树的当前层树节点中数值
//先保存右子结点到链表头,使得下层结点顺序为从左到右的顺序
if(curNode.right != null){
cur.addFirst(curNode.right);
}
//再保存左子结点到链表头,使得下层结点顺序为从左到右的顺序
if(curNode.left != null){
cur.addFirst(curNode.left);
}
}
result.add(curValue);
pre = cur;
flag = true;
}
}
return result;
}
}