最近做了不少二叉树的题,所以这道题两遍过了,第一遍是特别傻逼的忘记对root判空了,一定要注意。
方法是层序历遍,然后用tmp来标记行,用add()和addFirst()来实现LIST的不同方向插入
public static List<List<Integer>> zigzagLevelOrder(TreeNode root) {
LinkedList<List<Integer>> a1 = new LinkedList<List<Integer>>();
LinkedList<Integer> a2 = new LinkedList<Integer>();
Queue<TreeNode> q = new LinkedList<TreeNode>();
int i=0,j=0;
int tmp=0;
if(root==null) return a1;
q.offer(root);
j++;
while (!q.isEmpty()){
TreeNode t = q.poll();
j--;
if(t.left!=null){
q.offer(t.left);
i++;
}
if(t.right!=null){
q.offer(t.right);
i++;
}
if(tmp==0){
a2.add(t.val);
if(j==0){
j=i;
i=0;
a1.add(a2);
a2 = new LinkedList<Integer>();
tmp=1;
}
}else{
a2.addFirst(t.val);
if(j==0){
j=i;
i=0;
a1.add(a2);
a2 = new LinkedList<Integer>();
tmp=0;
}
}
}
return a1;
}
Update 2015/08/18: 相较于上一个历遍题,只需要增加一个变量flag记录层数,奇数层正序,偶数层逆序即可
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param root: The root of binary tree.
* @return: A list of lists of integer include
* the zigzag level order traversal of its nodes' values
*/
public ArrayList<ArrayList<Integer>> zigzagLevelOrder(TreeNode root) {
// write your code here
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
Queue<TreeNode> q = new LinkedList<>();
if (root == null)
return res;
int current = 1;
int next = 0;
int flag = 1;
ArrayList<Integer> in = new ArrayList<>();
while (root != null){
if (flag % 2 == 1)
in.add(root.val);
else
in.add(0, root.val);
if (root.left != null){
q.add(root.left);
next++;
}
if (root.right != null){
q.add(root.right);
next++;
}
if (q.size() != 0){
root = q.poll();
current--;
if (current == 0){
res.add(in);
in = new ArrayList<Integer>();
current = next;
next = 0;
flag++;
}
} else {
res.add(in);
break;
}
}
return res;
}
}