Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).javascript
For example:
Given binary tree [3,9,20,null,null,15,7]
,java
3 / \ 9 20 / \ 15 7
return its zigzag level order traversal as:node
[ [3], [20,9], [15,7] ]
按從上到下的順序記錄二叉樹的每一層,但每一層的左右順序與上一層相反。this
BFS,若是爲偶數層則將該層的序列逆置。code
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public List<List<Integer>> zigzagLevelOrder(TreeNode root) { List<List<Integer>> ans = new ArrayList<>(); Queue<TreeNode> q = new ArrayDeque<>(); int level = 0; if (root != null) { q.offer(root); } while (!q.isEmpty()) { level++; List<Integer> list = new ArrayList<>(); int size = q.size(); for (int i = 0; i < size; i++) { TreeNode cur = q.poll(); list.add(cur.val); if (cur.left!=null) q.offer(cur.left); if (cur.right!=null) q.offer(cur.right); } if (level % 2 == 0) { Collections.reverse(list); } ans.add(list); } return ans; } }
/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : right) * } */ /** * @param {TreeNode} root * @return {number[][]} */ var zigzagLevelOrder = function (root) { let ans = [] let q = [] let leftToRight = true if (root) { q.push(root) } while (q.length) { let size = q.length let tmp = [] while (size) { let cur = q.shift() if (cur.left) q.push(cur.left) if (cur.right) q.push(cur.right) if (leftToRight) { tmp.push(cur.val) } else { tmp.unshift(cur.val) } size-- } leftToRight = !leftToRight ans.push(tmp) } return ans }