题目描述
此题算是 102 的一个拓展版。
如何层序遍历已在 102 文章讲过,这里主要讲如何在输出时采用 zigzag 输出。
思路一
将每一层遍历后的结果视情况进行翻转。
代码如下:
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
if (root == null) return result;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
queue.offer(null);
List<Integer> layer = new ArrayList<>();
boolean zig = true;
while (!queue.isEmpty()) {
if (queue.peek() == null) {
if (!zig) {
Collections.reverse(layer);
}
result.add(layer);
queue.poll();
if (queue.isEmpty()) break;
queue.offer(null);
layer = new ArrayList<>();
zig = !zig;
continue;
}
TreeNode poll = queue.poll();
layer.add(poll.val);
if (poll.left != null) queue.offer(poll.left);
if (poll.right != null) queue.offer(poll.right);
}
return result;
}
思路二
在 layer 的构建过程中,就确定好顺序。利用双端队列的性质:
- 新元素从队列尾部加入,可以实现FIFO
- 新元素从队列头部加入,可以实现 FILO
代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
if (root == null) {
return new ArrayList<List<Integer>>();
}
List<List<Integer>> results = new ArrayList<List<Integer>>();
// add the root element with a delimiter to kick off the BFS loop
LinkedList<TreeNode> node_queue = new LinkedList<TreeNode>();
node_queue.addLast(root);
node_queue.addLast(null);
LinkedList<Integer> level_list = new LinkedList<Integer>();
boolean is_order_left = true;
while (node_queue.size() > 0) {
TreeNode curr_node = node_queue.pollFirst();
if (curr_node != null) {
if (is_order_left)
level_list.addLast(curr_node.val);
else
level_list.addFirst(curr_node.val);
if (curr_node.left != null)
node_queue.addLast(curr_node.left);
if (curr_node.right != null)
node_queue.addLast(curr_node.right);
} else {
// we finish the scan of one level
results.add(level_list);
level_list = new LinkedList<Integer>();
// prepare for the next level
if (node_queue.size() > 0)
node_queue.addLast(null);
is_order_left = !is_order_left;
}
}
return results;
}
}
作者:LeetCode
链接:https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal/solution/er-cha-shu-de-ju-chi-xing-ceng-ci-bian-li-by-leetc/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。