二叉树锯齿状遍历实现
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
返回锯齿形层次遍历如下:[[3], [20,9], [15,7]]
应用场景
实现方式
利用外部队列遍历
算法思想:广度优先搜索BFS+双端队列
- 以一个双端队列存储节点,插入和删除仅限在两端操作;
- 层与层之间LIFO,FILO交叉,正好满足一层正序,一层反序;
- 当前层遍历完后再从队列获取节点,遍历下一层;
- 队列为空时完成树的遍历;
递归逐层遍历
代码实现
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
| import java.util.ArrayList; import java.util.Deque; import java.util.LinkedList; import java.util.List;
public static List<List<Integer>> zigzagLevelOrder(TreeNode root) { List<List<Integer>> levels = new ArrayList<>(); if (root == null) { return levels; } return BFS(root, levels); }
private static List<List<Integer>> BFS(TreeNode root, List<List<Integer>> levels) { Deque<TreeNode> deque = new LinkedList<>(); deque.addLast(root); int level = 0;
boolean reverse = true; while (deque.size() > 0) { levels.add(new ArrayList<>()); int queueSize = deque.size(); for (int i = 0; i < queueSize; i++) { TreeNode node; if (reverse) { node = deque.removeFirst(); if (node.left != null) { deque.addLast(node.left); } if (node.right != null) { deque.addLast(node.right); } } else { node = deque.removeLast(); if (node.right != null) { deque.addFirst(node.right); } if (node.left != null) { deque.addFirst(node.left); } } levels.get(level).add(node.val); System.out.println(level + ",node-" + node.val); } reverse = !reverse; level++; } return levels; }
|