该题可以使用队列来完成,与普通的层序遍历不一样,之形层序遍历需要新加两个变量,其一是level表示当前层数,其二是last表示当前层次最后一个节点。每次遍历到最后一个节点时,把层数加1,如果层数是奇数,则直接把当前层次的结果加入res,如果层数是偶数,把当前层次的节点序列逆转即可。事件复杂度O(n)遍历了树,空间复杂度O(n)
public class Solution {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
int rear = 0;//队尾
int front = 0;//队头
int last = 1;//每层的最后一个节点
int level = 1;//表示当前遍历的层次
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();//返回结果
ArrayList<Integer> layerlist = new ArrayList<Integer>();//当前层次的元素
ArrayList<TreeNode> list = new ArrayList<TreeNode>();//队列
if(pRoot==null)return res;
list.add(pRoot);
rear++;
while(rear!=front){
TreeNode p = list.get(front++);
layerlist.add(p.val);
if(p.left!=null){
list.add(p.left);
rear++;
}
if(p.right!=null){
list.add(p.right);
rear++;
}
if(front == last){
if(level%2==0){
Collections.reverse(layerlist);//偶数层次的元素直接逆转
}
res.add((ArrayList<Integer>)layerlist.clone());
layerlist.clear();
last = rear;
level++;
}
}
return res;
}
}