662. Maximum Width of Binary Tree
Дан корень бинарного дерева, верните максимальную ширину данного дерева.
Максимальная ширина дерева - это максимальная ширина среди всех уровней.
Ширина одного уровня определяется как расстояние между конечными узлами (самыми левыми и самыми правыми ненулевыми узлами), где нулевые узлы между конечными узлами, которые присутствовали бы в полном бинарном дереве, продолжающемся до этого уровня, также учитываются при вычислении длины.
Гарантируется, что ответ будет в диапазоне 32-битного знакового целого числа.
Пример
Input: root = [1,3,2,5,3,null,9]
Output: 4
Explanation: The maximum width exists in the third level with length 4 (5,3,null,9).
C# решение
сопоставлено/оригиналusing System;
using System.Collections.Generic;
public class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int x) { val = x; }
}
public class Solution {
public int WidthOfBinaryTree(TreeNode root) {
if (root == null) return 0;
int maxWidth = 0;
Queue<(TreeNode node, int pos)> queue = new Queue<(TreeNode, int)>();
queue.Enqueue((root, 0));
while (queue.Count > 0) {
int levelSize = queue.Count;
int firstPos = queue.Peek().pos;
for (int i = 0; i < levelSize; i++) {
var (node, pos) = queue.Dequeue();
if (node.left != null) queue.Enqueue((node.left, 2 * pos));
if (node.right != null) queue.Enqueue((node.right, 2 * pos + 1));
}
maxWidth = Math.Max(maxWidth, queue.Peek().pos - firstPos + 1);
}
return maxWidth;
}
}
C++ решение
auto-draft, проверить перед отправкой#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
public class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int x) { val = x; }
}
class Solution {
public:
public int WidthOfBinaryTree(TreeNode root) {
if (root == null) return 0;
int maxWidth = 0;
queue<(TreeNode node, int pos)> queue = new queue<(TreeNode, int)>();
queue.Enqueue((root, 0));
while (queue.size() > 0) {
int levelSize = queue.size();
int firstPos = queue.Peek().pos;
for (int i = 0; i < levelSize; i++) {
var (node, pos) = queue.Dequeue();
if (node.left != null) queue.Enqueue((node.left, 2 * pos));
if (node.right != null) queue.Enqueue((node.right, 2 * pos + 1));
}
maxWidth = max(maxWidth, queue.Peek().pos - firstPos + 1);
}
return maxWidth;
}
}
Java решение
auto-draft, проверить перед отправкойimport java.util.*;
import java.math.*;
// Auto-generated Java draft from the C# solution. Review API differences before LeetCode submit.
public class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int x) { val = x; }
}
public class Solution {
public int WidthOfBinaryTree(TreeNode root) {
if (root == null) return 0;
int maxWidth = 0;
Queue<(TreeNode node, int pos)> queue = new LinkedList<(TreeNode, int)>();
queue.Enqueue((root, 0));
while (queue.size() > 0) {
int levelSize = queue.size();
int firstPos = queue.peek().pos;
for (int i = 0; i < levelSize; i++) {
var (node, pos) = queue.poll();
if (node.left != null) queue.Enqueue((node.left, 2 * pos));
if (node.right != null) queue.Enqueue((node.right, 2 * pos + 1));
}
maxWidth = Math.max(maxWidth, queue.peek().pos - firstPos + 1);
}
return maxWidth;
}
}
JavaScript решение
сопоставлено/оригиналvar widthOfBinaryTree = function(root) {
if (!root) return 0;
let maxWidth = 0;
const queue = [{ node: root, pos: 0 }];
while (queue.length > 0) {
const levelSize = queue.length;
const firstPos = queue[0].pos;
for (let i = 0; i < levelSize; i++) {
const { node, pos } = queue.shift();
if (node.left) queue.push({ node: node.left, pos: 2 * pos });
if (node.right) queue.push({ node: node.right, pos: 2 * pos + 1 });
}
const lastPos = queue[queue.length - 1]?.pos || firstPos;
maxWidth = Math.max(maxWidth, lastPos - firstPos + 1);
}
return maxWidth;
};
Python решение
сопоставлено/оригиналfrom collections import deque
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def widthOfBinaryTree(self, root: TreeNode) -> int:
if not root:
return 0
max_width = 0
queue = deque([(root, 0)])
while queue:
level_length = len(queue)
_, first_pos = queue[0]
for i in range(level_length):
node, pos = queue.popleft()
if node.left:
queue.append((node.left, 2 * pos))
if node.right:
queue.append((node.right, 2 * pos + 1))
max_width = max(max_width, pos - first_pos + 1)
return max_width
Algorithm
1⃣Инициализация:
Создайте очередь для хранения узлов и их позиций на уровне.
Начните с корневого узла и его позиции 0.
2⃣Обработка каждого уровня:
Для каждого уровня дерева получите его узлы и их позиции.
Вычислите ширину уровня как разницу между максимальной и минимальной позициями плюс один.
3⃣Обновление максимальной ширины:
Обновите максимальную ширину, если текущая ширина уровня больше.
😎
Вакансии для этой задачи
Показаны активные вакансии с пересечением по тегам задачи.