题目
给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。
每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。
解题
思路
一个二叉树,从根节点开始,从0开始,一次往后编码,1、2、3、4…
这样每一个根节点i的左子节点都是2 * i + 1;右子节点都是2 * i + 2;
再利用队列进行bfs,每一行的最大值减去最小值加一就是这个二叉树的最大宽度。
时间复杂度为O(n),空间复杂度也是O(n)。
代码
class Solution {
public int widthOfBinaryTree(TreeNode root) {
if (root == null) {
return 0;
}
LinkedList<TreeNode> queue = new LinkedList<>();
root.val = 0;
queue.add(root);
int result = 0;
while (!queue.isEmpty()) {
if (queue.getLast().val - queue.getFirst().val + 1 > result) {
result = queue.getLast().val - queue.getFirst().val + 1;
}
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode temp = queue.poll();
if (temp.left != null) {
temp.left.val = temp.val * 2 + 1;
queue.add(temp.left);
}
if (temp.right != null) {
temp.right.val = temp.val * 2 + 2;
queue.add(temp.right);
}
}
}
return result;
}
}