使用队列实现二叉树遍历,本题的特殊地方是遍历queue的时候需要轮换着使用从前往后,从后往前的方式遍历。
package leetcode;
import java.util.ArrayList;
import java.util.LinkedList;
public class BinaryTreeZigzagLevelOrderTraversal {
public static void main(String[] args) {
TreeNode node = new TreeNode(1);
node.left = new TreeNode(2);
BinaryTreeZigzagLevelOrderTraversal s = new BinaryTreeZigzagLevelOrderTraversal();
System.out.println(s.zigzagLevelOrder(node));
}
public ArrayList<ArrayList<Integer>> zigzagLevelOrder(TreeNode root) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if (root == null) {
return result;
}
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
boolean flag = true;
while (!queue.isEmpty()) {
ArrayList<Integer> list = new ArrayList<Integer>();
if (flag) {
TreeNode last = queue.getLast();
TreeNode node = null;
do {
node = queue.getFirst();
list.add(node.val);
if (node.left != null) {
queue.addLast(node.left);
}
if (node.right != null) {
queue.addLast(node.right);
}
queue.removeFirst();
if (queue.isEmpty()) {
break;
}
} while (node != last);
} else {
TreeNode node = null;
TreeNode first = queue.getFirst();
do {
node = queue.getLast();
list.add(node.val);
if (node.right != null) {
queue.addFirst(node.right);
}
if (node.left != null) {
queue.addFirst(node.left);
}
queue.removeLast();
if (queue.isEmpty()) {
break;
}
} while(node != first);
}
flag = !flag;
result.add(list);
}
return result;
}
}