也是二叉树的层序遍历
要有一个标志位来区分是奇数层还是偶数层
同时需要一个队列能顺序输出节点,还得会逆序输出节点
双端队列可以办到。
package 剑指offer.树;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
/**
* 奇数层从左到右遍历,偶数层从右向左排列
*
*/
public class 锯齿形遍历二叉树 {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> ans = new LinkedList<List<Integer>>();
//根节点
if (root == null) {
return ans;
}
Queue<TreeNode> nodeQueue = new LinkedList<TreeNode>();
nodeQueue.offer(root);
boolean isOrderLeft = true;
while (!nodeQueue.isEmpty()) {
//Deque是双端队列
Deque<Integer> levelList = new LinkedList<Integer>();
int size = nodeQueue.size();
for (int i = 0; i < size; i++) {
TreeNode curNode = nodeQueue.poll();
if (isOrderLeft) {
//加到右边
levelList.offerLast(curNode.val);
} else {
//加到左边
levelList.offerFirst(curNode.val);
}
//
if (curNode.left != null) {
nodeQueue.offer(curNode.left);
}
if (curNode.right != null) {
nodeQueue.offer(curNode.right);
}
}
ans.add(new LinkedList<Integer>(levelList));
isOrderLeft = !isOrderLeft;
}
return ans;
}
}