Problem:
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).
Explanation:
二叉树z字型层序遍历。
My Thinking:
在层序遍历的基础上增加一个方向变量lefttoright,对加入结点的顺序进行控制。
My Solution:
class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> result=new ArrayList<>();
Queue<TreeNode> queue=new LinkedList<>();
queue.add(root);
boolean lefttoright=false;
while(!queue.isEmpty()){
int length=queue.size();
List<TreeNode> list=new ArrayList<>();
for(int i=0;i<length;i++){
TreeNode node=queue.poll();
if(node==null)
continue;
list.add(node);
}
if(lefttoright){//下一条从左往右
for(int i=list.size()-1;i>=0;i--){
TreeNode node=list.get(i);
queue.add(node.left);
queue.add(node.right);
}
}else{
for(int i=list.size()-1;i>=0;i--){
TreeNode node=list.get(i);
queue.add(node.right);
queue.add(node.left);
}
}
lefttoright=lefttoright?false:true;
if(list.size()>0){
List<Integer> numlist=new ArrayList<>();
for(TreeNode node:list){
numlist.add(node.val);
}
result.add(numlist);
}
}
return result;
}
}
Optimum Thinking:
Optimum Solution: