Сложность: medium
Дан корень бинарного дерева, верните максимальную ширину данного дерева.
Максимальная ширина дерева - это максимальная ширина среди всех уровней.
Ширина одного уровня определяется как расстояние между конечными узлами (самыми левыми и самыми правыми ненулевыми узлами), где нулевые узлы между конечными узлами, которые присутствовали бы в полном бинарном дереве, продолжающемся до этого уровня, также учитываются при вычислении длины.
Гарантируется, что ответ будет в диапазоне 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).
👨💻 Алгоритм:
1⃣Инициализация:
Создайте очередь для хранения узлов и их позиций на уровне.
Начните с корневого узла и его позиции 0.
2⃣Обработка каждого уровня:
Для каждого уровня дерева получите его узлы и их позиции.
Вычислите ширину уровня как разницу между максимальной и минимальной позициями плюс один.
3⃣Обновление максимальной ширины:
Обновите максимальную ширину, если текущая ширина уровня больше.
😎 Решение:
public class TreeNode {
public var val: Int
public var left: TreeNode?
public var right: TreeNode?
public init() { self.val = 0; self.left = nil; self.right = nil; }
public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
self.val = val
self.left = left
self.right = right
}
}
class Solution {
func widthOfBinaryTree(_ root: TreeNode?) -> Int {
guard let root = root else { return 0 }
var maxWidth = 0
var queue: [(TreeNode, Int)] = [(root, 0)]
while !queue.isEmpty {
let levelSize = queue.count
let firstPos = queue.first!.1
for _ in 0..<levelSize {
let (node, pos) = queue.removeFirst()
if let left = node.left {
queue.append((left, 2 * pos))
}
if let right = node.right {
queue.append((right, 2 * pos + 1))
}
if node === queue.last?.0 {
maxWidth = max(maxWidth, pos - firstPos + 1)
}
}
}
return maxWidth
}
}Ставь 👍 и забирай 📚 Базу знаний