题目来源:https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/
问题描述
103. Binary Tree Zigzag Level Order Traversal
Medium
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).
For example:
Given binary tree [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
return its zigzag level order traversal as:
[
[3],
[20,9],
[15,7]
]
------------------------------------------------------------
题意
LeetCode 102. Binary Tree Level Order Traversal(二叉树bfs)的姊妹题。蛇形方式输出二叉树。
------------------------------------------------------------
思路
在LeetCode 102. Binary Tree Level Order Traversal(二叉树bfs)的解法的基础上增加奇数层取反的操作。Java中List倒序用Collections.reverse方法。
------------------------------------------------------------
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
class ListNode {
int val, level;
TreeNode left, right;
public ListNode(int val, int level, TreeNode left, TreeNode right) {
this.val = val;
this.level = level;
this.left = left;
this.right = right;
}
}
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
if (root == null) {
return Collections.emptyList();
}
LinkedList<ListNode> queue = new LinkedList<ListNode>();
queue.add(new ListNode(root.val, 0, root.left, root.right));
int curLevel = 0;
List<List<Integer>> ret = new LinkedList<>();
List<Integer> levelList = new LinkedList<Integer>();
while (!queue.isEmpty()) {
ListNode head = queue.pollFirst();
if (head.left != null) {
queue.add(new ListNode(head.left.val, head.level+1, head.left.left, head.left.right));
}
if (head.right != null) {
queue.add(new ListNode(head.right.val, head.level+1, head.right.left, head.right.right));
}
if (head.level > curLevel) {
if (curLevel%2 == 1) {
Collections.reverse(levelList);
}
ret.add(levelList);
levelList = new LinkedList<Integer>();
curLevel = head.level;
}
levelList.add(head.val);
}
if (curLevel%2 == 1) {
Collections.reverse(levelList);
}
ret.add(levelList);
return ret;
}
}