Description:
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]
]
题意:给定一颗二叉树,要求输出z
字型的层序遍历;
解法:对于层次遍历,可以想到利用队列来实现;那么,对于题目要求的z
字型的层次遍历,需要额外一个变量,用来记录在每一层中的遍历方向;我们用链表来存储每一层的节点,这样,当层的遍历为从左至右的时候,我们向链表的尾部插入元素;当层的遍历为从右至左的时候,我们向链表的首部插入元素;
Java
/**
* 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) {
ArrayList<List<Integer>> result = new ArrayList<>();
if (root == null) {
return result;
}
LinkedList<TreeNode> queue = new LinkedList<>();
queue.addLast(root);
int len = 1;
int direction = 1;
while (!queue.isEmpty()) {
LinkedList<Integer> list = new LinkedList<>();
int temp = len;
len = 0;
while (temp-- > 0) {
TreeNode node = queue.poll();
if (direction == 1) {
list.addLast(node.val);
} else {
list.addFirst(node.val);
}
if (node.left != null) {
queue.addLast(node.left);
len++;
}
if (node.right != null) {
queue.addLast(node.right);
len++;
}
}
result.add(list);
direction *= -1;
}
return result;
}
}