题目
给你一棵二叉树的根节点 root ,返回树的 最大宽度 。
树的 最大宽度 是所有层中最大的 宽度 。
每一层的 宽度
被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的 null
节点,这些 null 节点也计入长度。
public int widthOfBinaryTree(TreeNode root) {
if (root == null) {
return 0;
}
// 根据二叉树的性质, 左边的顺序为 index * 2, 右边的节点为 index * 2 + 1
LinkedList<HashMap<TreeNode, Integer>> queue = new LinkedList<>();
queue.offer(new HashMap<>(){
{
put(root, 1);
}
});
int res = 1;
LinkedList<HashMap<TreeNode, Integer>> temp = new LinkedList<>();
while (!queue.isEmpty()) {
HashMap<TreeNode, Integer> current = queue.poll();
for (Map.Entry<TreeNode, Integer> map : current.entrySet()) {
TreeNode node = map.getKey();
int value = map.getValue();
if (node.left != null) {
// new HashMap<>().put() 这种方法会返回空值
temp.offer(new HashMap<>(){
{
put(node.left, value * 2);
}
});
}
if (node.right != null) {
temp.offer(new HashMap<>(){
{
put(node.right, value * 2 + 1);
}
});
}
}
if (queue.isEmpty()) {
// 使用addAll方法,而不是直接赋值的原因是因为,当temp中的数据清空时,queue中的数据也会清空
queue.addAll(temp);
if (!temp.isEmpty()) {
HashMap<TreeNode, Integer> first = temp.getFirst();
int firstValue = 0;
for (Map.Entry<TreeNode, Integer> map : first.entrySet()) {
firstValue = map.getValue();
}
int lastValue = 0;
HashMap<TreeNode, Integer> last = temp.getLast();
for (Map.Entry<TreeNode, Integer> map : last.entrySet()) {
lastValue = map.getValue();
}
res = Math.max(res, lastValue - firstValue + 1);
temp.clear();
}
}
}
return res;
}