描述
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
数据范围:0≤n≤15000 \le n \le 15000≤n≤1500,树上每个节点的val满足 ∣val∣<=100|val| <= 100∣val∣<=100
要求:空间复杂度:O(n)O(n) O(n),时间复杂度:O(n)O(n)O(n)
例如:
给定的二叉树是{1,2,3,#,#,4,5}
该二叉树之字形层序遍历的结果是
[
[1],
[3,2],
[4,5]
]
创建一个双向队列,来进行二叉树的层序遍历,先将投节点放入队列,然后记住队列的当前长度,用一个变量flag来决定是从左到右遍历还是从右到左遍历,遍历队列的同时再将遍历到的节点的子节点也加入到队列中,用一个list集合记住每层出队的节点就可以了
Java代码
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> result=new ArrayList<>();
if(pRoot==null)return result;
LinkedList<TreeNode> list=new LinkedList<>();
int flag=0;
list.addFirst(pRoot);
while(!list.isEmpty()){
int size=list.size();
ArrayList<Integer> as=new ArrayList<>();
if(flag==0){
flag=1;
while(size>0){
TreeNode tn=list.removeFirst();
as.add(tn.val);
if(tn.left!=null)list.add(tn.left);
if(tn.right!=null)list.add(tn.right);
size--;
}
}else {
flag=0;
while(size>0){
TreeNode tn=list.removeLast();
as.add(tn.val);
if(tn.right!=null)list.addFirst(tn.right);
if(tn.left!=null)list.addFirst(tn.left);
size--;
}
}
result.add(as);
}
return result;
}
代码还有一些可优化的地方,欢迎大家来讨论!