最简单的思路就是简单的层序遍历 + Collections反转 也可以分成left2righ和right2left两种情况讨论, 让每次切换遍历方向的时候, 也更换push和pop的对应的方向, 还有先left还是先right
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() {} TreeNode(int val) { this.val = val; } TreeNode(int val, TreeNode left, TreeNode right) { this.val = val; this.left = left; this.right = right; } }
class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) { if (root == null) return List.of(); List<List<Integer>> ans = new ArrayList<>(); boolean left2right = true; Deque<TreeNode> st = new ArrayDeque<>(); st.addLast(root); while (!st.isEmpty()) { int size = st.size(); List<Integer> curLevel = new ArrayList<>(); for (int i = 0; i < size; i++) { TreeNode cur = left2right ? st.removeFirst() : st.removeLast(); curLevel.add(cur.val); if (left2right) { if (cur.left != null) st.addLast(cur.left); if (cur.right != null) st.addLast(cur.right); } else { if (cur.right != null) st.addFirst(cur.right); if (cur.left != null) st.addFirst(cur.left); } } ans.add(curLevel); left2right = !left2right; } return ans; } }
|