思路:和广度优先搜索一样的思路,只是每隔一层需要将元素倒置,这里只需使用ArrayList的头插法即可。
public ArrayList<ArrayList<Integer>> zigzagLevelOrder (TreeNode root) {
if(root==null ) return new ArrayList<>();
ArrayList<ArrayList<Integer>> result=new ArrayList<>(); //返回result,存储每层节点
Queue<TreeNode> queue=new LinkedList<>();
queue.add(root); //放入根节点
int level=1; //定义层数,根节点为第一层
while(!queue.isEmpty()){
ArrayList<Integer> arr=new ArrayList<>(); //放置每一层节点的动态数组,每次循环将被重置
//计数每层的节点,进行循环放入ArrayList数组中
int levelNum=queue.size();
for(int i=0;i<levelNum;i++){
TreeNode node=queue.poll();
//判断是奇数层还是偶数层,偶数层需要使用头插法
if(level%2!=0){
arr.add(node.val);
}else{
arr.add(0,node.val);
}
//加入节点的左右子树
if(node.left!=null) queue.add(node.left);
if(node.right!=null) queue.add(node.right);
}
result.add(arr);
level++; //一层增加一
}
return result;
}
}
京公网安备 11010502036488号