662.二叉树最大宽度
思路:
本题可以考虑将二叉树每个节点的值都进行替换,最后直接用 最左边和最右边节点的值相减+1 得出最大宽度
- 将根节点值设为 1(这里任意数都可以),则根节点的左节点值设为 2×1 ,右节点则为 (2×1)+1
- 这里使用双端队列方便得到其 最左边节点的值 和 最右边节点的值 ,根据队列当前大小来逐层放入元素,最后 相减+1 得出最大宽度
注意点:
最大宽度不一定是最下面一层,所以要 与上一层相比较取最大值
代码实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int widthOfBinaryTree(TreeNode root) {
Deque<TreeNode> deque = new LinkedList<>();
if (root == null) return 0;
root.val = 1;
deque.add(root);
int max = 0;
while (!deque.isEmpty()) {
int size = deque.size();
max = Math.max(max,deque.getLast().val - deque.getFirst().val + 1);
for (int i = 0; i < size; i++) {
TreeNode node = deque.pop();
if (node.left != null) {
node.left.val = 2 * node.val;
deque.add(node.left);
}
if (node.right != null) {
node.right.val = 2 * node.val + 1;
deque.add(node.right);
}
}
}
return max;
}
}