给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
我的思路:与102的不同之处在于需要借助双端队列,判断当奇数层时,父亲从尾出,左孩子右孩子依次从头进;当偶数层时,父亲从头出,右孩子左孩子依次从尾进
代码如下:
public class Solution { public List<List<Integer>> zigzagLevelOrder(TreeNode root) { if (root == null){ return new ArrayList<>(); } List<List<Integer>> res = new ArrayList<>(); Deque<TreeNode> deque = new LinkedList<>(); int level = 1; deque.addLast(root); while (!deque.isEmpty()){ List<Integer> combine = new ArrayList<>(); int len = deque.size(); if (level % 2 == 1){ //从左往右 while (len >= 1){ //父亲从尾出,左孩子右孩子依次从头进 TreeNode fN = deque.removeLast(); combine.add(fN.val); len--; if (fN.left != null){ deque.addFirst(fN.left); } if (fN.right != null){ deque.addFirst(fN.right); } } }else { //从右往左 while (len >= 1){ //父亲从头出,右孩子左孩子依次从尾进 TreeNode fN = deque.removeFirst(); combine.add(fN.val); len--; if (fN.right != null){ deque.addLast(fN.right); } if (fN.left != null){ deque.addLast(fN.left); } } } res.add(combine); level++; } return res; } }
官方给出的解中定义队列用来层次遍历,双端队列用来存值,感觉浪费了很多空间
代码如下:
class Solution {
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<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;
}
}