1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
LinkedList<List<Integer>> levels = new LinkedList<>();
dfs(root, 0, levels);
return levels;
}

private void dfs(TreeNode node, int level, LinkedList<List<Integer>> levels) {
if (node == null) {
return;
}
if (levels.size() == level) {
levels.addFirst(new ArrayList<>());
}
levels.get(levels.size() - 1 - level).add(node.val);
dfs(node.left, level + 1, levels);
dfs(node.right, level + 1, levels);
}
}

就是把新的level加到开头即可. 那如何获得某个level在list中的位置呢? 我们发现规律:
level 0在末尾, level 1在倒数第二… 因此level + 它的index = list.size() - 1. 于是当我们遇到一个level, 它在list中的index就是list.size() - 1 - level.

时间复杂度: O(n)
空间复杂度: O(n)

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
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
LinkedList<List<Integer>> levels = new LinkedList<>();
if (root == null) {
return levels;
}
Deque<TreeNode> nodeQ = new ArrayDeque<>();
nodeQ.offer(root);
while (!nodeQ.isEmpty()) {
List<Integer> currLevel = new ArrayList<>();
for (int i = nodeQ.size(); i > 0; i--) {
TreeNode currNode = nodeQ.poll();
currLevel.add(currNode.val);
if (currNode.left != null) {
nodeQ.offer(currNode.left);
}
if (currNode.right != null) {
nodeQ.offer(currNode.right);
}
}
levels.addFirst(currLevel);
}
return levels;
}
}

BFS的写法. 时间复杂度和空间复杂度不变.