题目:https://leetcode.com/problems/maximum-width-of-binary-tree/
Given a binary tree, write a function to get the maximum width of the given tree. The width of a tree is the maximum width among all levels. The binary tree has the same structure as a full binary tree, but some nodes are null.
The width of one level is defined as the length between the end-nodes (the leftmost and right most non-null nodes in the level, where the null
nodes between the end-nodes are also counted into the length calculation.
这道题让我们求二叉树的最大宽度,即每一层中最左边非空节点到最右边非空节点的“距离”。算宽度一般使用BFS。如果要算距离,就需要在遍历的同时对节点进行层数的划分,在遍历完每一层的节点后都要对最大层数进行更新。
二叉树中,若设父节点在该层的相对位置为f,则左子节点的相对位置为2f,右子节点的相对位置为2f+1。通过计算每一层中最左和最右节点相对位置的差即可得到该层的长度。
public int widthOfBinaryTree(TreeNode root) {
if(root == null) return 0;
int maxWidth = 0;
Queue<Pair<TreeNode, Integer>> queue = new LinkedList<>();
queue.offer(new Pair(root, 0));
while(!queue.isEmpty()){
//Pair中保存的是每个节点和其对应的相对位置
Pair<TreeNode, Integer> first = queue.peek();
//获取该层的节点数
int size = queue.size();
Pair<TreeNode, Integer> curr = null;
//对每一层节点进行计算
while(size-- > 0){
curr = queue.poll();
TreeNode node = curr.getKey();
int index = curr.getValue();
//添加子节点
if(node.left != null) queue.offer(new Pair(node.left, 2 * index));
if(node.right != null) queue.offer(new Pair(node.right, 2 * index + 1));
}
maxWidth = Math.max(maxWidth, curr.getValue() - first.getValue() + 1);
}
return maxWidth;
}