二叉树的锯齿形层序遍历
给你二叉树的根节点root,返回其节点值的锯齿形层序遍历(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)
就是一个基本的BFS算法,唯一的区别就是加一个flag用于判断遍历的方向,进行交替性的转换方向. 比较清楚的一点是,在每层遍历的时候直接用一个双端队列
- 如果是左方向遍历,就将节点加到队尾
- 如果是右方向遍历,就将节点加到对头
即可实现要求.
public class Solution016 {
public static void main(String[] args) {
TreeNode l5 = new TreeNode(7),
l4 = new TreeNode(15),
l3 = new TreeNode(20,l4,l5),
l2 = new TreeNode(9),
l1 = new TreeNode(3,l2,l3);
List<List<Integer>> lists = zigzagLevelOrder(l1);
System.out.println(Arrays.toString(lists.toArray()));
}
public static List<List<Integer>> zigzagLevelOrder(TreeNode root){
List<List<Integer>> ans = new ArrayList<>();
if (root==null) return ans;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
boolean flag = true;//用于判断遍历的方向
while (!queue.isEmpty()){
int size = queue.size();
Deque<Integer> res = new LinkedList<>();
for (int i=0;i<size;i++){
TreeNode node = queue.poll();
//添加进入list的顺序不同
if (flag) {
res.offerLast(node.val);
}else{
res.offerFirst(node.val);
}
if (node.left!=null) queue.add(node.left);
if (node.right!=null) queue.add(node.right);
}
ans.add(new ArrayList<>(res));
flag = !flag;
}
return ans;
}
}