题目描述
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,#,#,15,7}
,
3 / \ 9 20 / \ 15 7
return its zigzag level order traversal as:
[ [3], [20,9], [15,7] ]
解题思路
此题和
Binary Tree Level Order Traversal II这道题几乎一样。
可以考虑使用Queue(队列)来实现。
队列为队首出队尾进,从队首remove一个元素,则应把它的所有子节点添加到队尾,直到队列中的所有元素均被remove为止。可以利用一个变量来记录每层的节点个数,作为获取下一层节点的弹出元素个数。
队列为队首出队尾进,从队首remove一个元素,则应把它的所有子节点添加到队尾,直到队列中的所有元素均被remove为止。可以利用一个变量来记录每层的节点个数,作为获取下一层节点的弹出元素个数。
只是在最后反转一下队列即可。
或者不在最后反转而是控制进出队列的顺序,一层从左往右遍历,一层从右往左遍历输出。
代码
public ArrayList<ArrayList<Integer>> zigzagLevelOrder(TreeNode root) {
ArrayList<ArrayList<Integer>> levelList = new ArrayList<ArrayList<Integer>>();
//如果根节点为null则直接返回空的list
if(root==null){
return levelList;
}
Queue<TreeNode> queue = new LinkedList<TreeNode>();
int len = 1;//队列初始长度为1,
int cur = 1;//记录每层节点的个数
queue.add(root);//添加根节点到队列中
while(!queue.isEmpty()){
len = cur;
cur = 0;
ArrayList<Integer> list = new ArrayList<Integer>();
for(int i = 0;i < len;i++){
TreeNode node = queue.peek();
if(node.left!=null){
cur++;
queue.offer(node.left);
}
if(node.right!=null){
cur++;
queue.offer(node.right);
}
list.add(node.val);
queue.remove();
}
levelList.add(list);
}
int k = 0;
for(ArrayList<Integer> list:levelList){
k++;
if(k==2){
Collections.reverse(list);//逆转列表
k = 0;
}
}
return levelList;
}
如果想通过控制队列的出对顺序,可以考虑修改以下一段代码,通过添加变量k,来控制。这里就不列出来了。
for(int i = 0;i < len;i++){
TreeNode node = queue.peek();
if(node.left!=null){
cur++;
queue.offer(node.left);
}
if(node.right!=null){
cur++;
queue.offer(node.right);
}
list.add(node.val);
queue.remove();
}