题目

类型:BFS

难度:中等

image.png

解题思路

对树进行逐层遍历,用队列维护当前层的所有元素,当队列不为空的时候,求得当前队列的长度 size,每次从队列中取出 size个元素进行拓展,然后进行下一次迭代。

为了满足要求的返回值先从左往右,再从右往左交替输出的锯齿形,可以利用双端队列的数据结构来维护当前层节点值输出的顺序。

双端队列是一个可以在队列任意一端插入元素的队列。在广度优先搜索遍历当前层节点拓展下一层节点的时候仍然从左往右按顺序拓展,但是对当前层节点的存储我们维护一个变量 isOrderLeft 记录是从左至右还是从右至左的:

  • 如果从左至右,每次将被遍历到的元素插入至双端队列的末尾。
  • 如果从右至左,每次将被遍历到的元素插入至双端队列的头部。

代码

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