LeetCode:剑指 Offer 32 - III. 从上到下打印二叉树 III
树的层序遍历 >> 结合 队列 Queue<TreeNode> queue = new LinkedList<>()
正常的将节点从左到右添加进队列,在特定的层数中, 将 list 反转即可
List<List<Integer>> ans = new ArrayList<>();
List<Integer> list = new ArrayList<>();
public List<List<Integer>> levelOrder(TreeNode root) {
if (root == null) {
return ans;
}
dfs(root);
return ans;
}
// 记录层数
int cnt = 0;
public void dfs(TreeNode node) {
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(node);
while (!queue.isEmpty()) {
// size 记录上一层节点的个数
int size = queue.size();
for (int i = 0; i < size; i++) {
// 反向输出
TreeNode pop = ((LinkedList<TreeNode>) queue).pop();
if (pop.left != null) {
queue.offer(pop.left);
}
if (pop.right != null) {
queue.offer(pop.right);
}
// 先统一从左到右add, 后面 reverse
list.add(pop.val);
}
if(cnt % 2 == 1){
// 奇数 ---- 右到左
Collections.reverse(list);
}
ans.add(new ArrayList<>(list));
list.clear();
cnt++;
}
}