给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。
每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。
中等难度。我们使用层序遍历,同时记住每一个节点在当前层的索引位置即可,每层遍历完毕,使用最右节点的索引位置减去最左节点的索引位置再+1即为每层的最大宽度。
public int widthOfBinaryTree(TreeNode root) {
if (root == null) return 0;
//元素队列
LinkedList<TreeNode> nodeQueue = new LinkedList<>();
//元素对应的索引位置队列
LinkedList<Integer> indexQueue = new LinkedList<>();
nodeQueue.addLast(root);
indexQueue.addLast(1);
//最大宽度
int max = 1;
while (!nodeQueue.isEmpty()) {
int size = nodeQueue.size();
//每一行的最左节点索引left,最右节点索引right
int left = 0, right = 0;
for (int i = 0; i < size; i++) {
TreeNode node = nodeQueue.removeFirst();
int index = indexQueue.removeFirst();
//起始索引
if (i == 0) {
left = index;
}
//结束索引
if (i == size - 1) {
right = index;
}
//子节点的左子节点
if (node.left != null) {
nodeQueue.addLast(node.left);
//子节点的左子节点的位置
indexQueue.addLast(2 * index);
}
if (node.right != null) {
nodeQueue.addLast(node.right);
//子节点的右子节点的位置
indexQueue.addLast(2 * index + 1);
}
}
//计算最大宽度
max = Math.max(max, right - left + 1);
}
return max;
}