662. Maximum Width of Binary Tree

DFS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
private static class State {
private int maxWidth;
}

public int widthOfBinaryTree(TreeNode root) {
State state = new State();
Map<Integer, Integer> depthToLeftIndexMap = new HashMap<>();
dfs(root, depthToLeftIndexMap, 0, 1, state);
return state.maxWidth;
}

private void dfs(TreeNode root, Map<Integer, Integer> depthToLeftIndexMap, int depth, int index, State state) {
if (root == null) {
return;
}

depthToLeftIndexMap.putIfAbsent(depth, index);
state.maxWidth = Math.max(state.maxWidth, index - depthToLeftIndexMap.get(depth) + 1);

dfs(root.left, depthToLeftIndexMap, depth + 1, index * 2, state);
dfs(root.right, depthToLeftIndexMap, depth + 1, index * 2 + 1, state);
}
}

BFS

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
class Solution {
public int widthOfBinaryTree(TreeNode root) {
int maxWidth = 1;

Queue<TreeNode> queue = new LinkedList<>(); // 队列中不包含空节点
Deque<Integer> indexDeque = new LinkedList<>();

queue.offer(root);
indexDeque.offer(1);

while (!queue.isEmpty()) {
for (int i = queue.size(); i > 0; i--) {
TreeNode node = queue.poll();
int index = indexDeque.poll();

if (node.left != null) {
queue.offer(node.left);
indexDeque.offer(index * 2);
}
if (node.right != null) {
queue.offer(node.right);
indexDeque.offer(index * 2 + 1);
}
}

if (!indexDeque.isEmpty()) {
maxWidth = Math.max(maxWidth, indexDeque.getLast() - indexDeque.getFirst() + 1);
}
}

return maxWidth;
}
}

队列中不存储空节点,以避免二叉树高度很高时需要存储大量的空节点导致内存溢出。

References

662. Maximum Width of Binary Tree