103. 二叉树的锯齿形层序遍历

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
  18. if (root == null)
  19. return new ArrayList();
  20. List<List<Integer>> ans = new ArrayList<>();
  21. Deque<TreeNode>[] stack = new Deque[2];
  22. stack[0] = new LinkedList<>();
  23. stack[1] = new LinkedList<>();
  24. int current = 0;
  25. int next = 1;
  26. stack[current].add(root);
  27. List<Integer> list = new ArrayList<>();
  28. while (!stack[0].isEmpty() || !stack[1].isEmpty()) {
  29. TreeNode node = stack[current].pop();
  30. list.add(node.val);
  31. if (current == 0) {
  32. if (node.left != null) {
  33. stack[next].push(node.left);
  34. }
  35. if (node.right != null) {
  36. stack[next].push(node.right);
  37. }
  38. } else {
  39. if (node.right != null) {
  40. stack[next].push(node.right);
  41. }
  42. if (node.left != null) {
  43. stack[next].push(node.left);
  44. }
  45. }
  46. if (stack[current].isEmpty()) {
  47. ans.add(list);
  48. list = new ArrayList<Integer>();
  49. current = 1 - current;
  50. next = 1 - next;
  51. }
  52. }
  53. return ans;
  54. }
  55. }