題目:
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]
]
和102類似,只不過偶數層的順序是反過來的。
AC:
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> resultList = new LinkedList<>();
if (root == null) {
return resultList;
}
List<TreeNode> tmpList = new LinkedList<>();
tmpList.add(root);
boolean order = true;
while (!tmpList.isEmpty()) {
List<Integer> valueList = new LinkedList<>();
int size = tmpList.size();
for (int i = 0; i < size; i++) {
TreeNode node = tmpList.get(0);
if (node.left != null) {
tmpList.add(node.left);
}
if (node.right != null) {
tmpList.add(node.right);
}
if (order) {
valueList.add(node.val);
} else {
valueList.add(0, node.val);
}
tmpList.remove(0);
}
order = !order;
resultList.add(valueList);
}
return resultList;
}
迭代,3ms
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> resultList = new ArrayList<>();
helper(resultList, root, 1);
return resultList;
}
private void helper(List<List<Integer>> resultList, TreeNode root, int depth) {
if (root == null) {
return;
}
if (resultList.size() < depth) {
resultList.add(new LinkedList<>());
}
if ((depth & 1) != 0) {
resultList.get(depth - 1).add(root.val);
} else {
resultList.get(depth - 1).add(0, root.val);
}
helper(resultList, root.left, depth + 1);
helper(resultList, root.right, depth + 1);
}
遞歸2ms。當奇數層時,按順序插入,偶數層時,右邊所有的數插入在左邊所有數的前面。