categories: [Blog,Algorithm,mid]


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

难度中等402
给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7

返回锯齿形层序遍历如下:
[
[3],
[20,9],
[15,7]
]

  1. public List<List<Integer>> zigzagLevelOrder1(TreeNode root) {
  2. List<List<Integer>> ans = new LinkedList<List<Integer>>();
  3. if (root == null) {
  4. return ans;
  5. }
  6. Queue<TreeNode> nodeQueue = new LinkedList<TreeNode>();
  7. nodeQueue.offer(root);
  8. boolean isOrderLeft = true;
  9. while (!nodeQueue.isEmpty()) {
  10. Deque<Integer> levelList = new LinkedList<Integer>();
  11. int size = nodeQueue.size();
  12. for (int i = 0; i < size; ++i) {
  13. TreeNode curNode = nodeQueue.poll();
  14. if (isOrderLeft) {
  15. levelList.offerLast(curNode.val);
  16. } else {
  17. levelList.offerFirst(curNode.val);
  18. }
  19. if (curNode.left != null) {
  20. nodeQueue.offer(curNode.left);
  21. }
  22. if (curNode.right != null) {
  23. nodeQueue.offer(curNode.right);
  24. }
  25. }
  26. ans.add(new LinkedList<Integer>(levelList));
  27. isOrderLeft = !isOrderLeft;
  28. }
  29. return ans;
  30. }
  1. public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
  2. List<List<Integer>> ans = new LinkedList<List<Integer>>();
  3. if (root == null) {
  4. return ans;
  5. }
  6. Queue<TreeNode> nodeQueue = new LinkedList<TreeNode>();
  7. nodeQueue.offer(root);
  8. boolean isOrderLeft = true;
  9. while (!nodeQueue.isEmpty()) {
  10. // Deque<Integer> levelList = new LinkedList<Integer>();
  11. List<Integer> levelList = new ArrayList<Integer>();
  12. int size = nodeQueue.size();
  13. for (int i = 0; i < size; ++i) {
  14. TreeNode curNode = nodeQueue.poll();
  15. levelList.add(curNode.val);
  16. // if (isOrderLeft) {
  17. // levelList.offerLast(curNode.val);
  18. // } else {
  19. // levelList.offerFirst(curNode.val);
  20. // }
  21. if (curNode.left != null) {
  22. nodeQueue.offer(curNode.left);
  23. }
  24. if (curNode.right != null) {
  25. nodeQueue.offer(curNode.right);
  26. }
  27. }
  28. // ans.add(new ArrayList<Integer>(levelList));
  29. //isOrderLeft = !isOrderLeft;
  30. if(ans.size()%2==1){
  31. Collections.reverse(levelList);
  32. }
  33. ans.add(new ArrayList<Integer>(levelList));
  34. }
  35. return ans;
  36. }