Сложность: medium
Дан корень бинарного дерева, каждый узел в дереве имеет уникальное значение.
После удаления всех узлов со значением из to_delete, остаётся лес (несвязное объединение деревьев).
Верните корни деревьев в оставшемся лесу. Вы можете вернуть результат в любом порядке.
Пример:
Input: root = [1,2,3,4,5,6,7], to_delete = [3,5]
Output: [[1,2,null,4],[6],[7]]
👨💻 Алгоритм:
1⃣Инициализация:
Преобразуйте массив to_delete в множество toDeleteSet для эффективного поиска.
Создайте пустой список forest для хранения корней деревьев в результирующем лесу.
2⃣Рекурсивный обход:
Выполните обход дерева в порядке пост-ордера, чтобы сначала обработать все дочерние узлы перед текущим узлом (node):
- рекурсивно вызовите processNode для левого и правого дочерних узлов node и обновите левого и правого дочернего узла с возвращаемым значением.
3⃣Оценка узла:
Проверьте, нужно ли удалить текущий узел, проверив, существует ли его значение в toDeleteSet. Если узел нужно удалить:
- если у узла есть левый или правый дочерний узел, добавьте их в forest.
- верните null для его родителя, чтобы эффективно удалить текущий узел, не подключая его обратно к родительскому узлу.
Если узел не нужно удалять, верните сам узел.
😎 Решение:
class Solution {
func delNodes(_ root: TreeNode?, _ to_delete: [Int]) -> [TreeNode?] {
var toDeleteSet = Set(to_delete)
var forest = [TreeNode?]()
func processNode(_ node: TreeNode?) -> TreeNode? {
guard let node = node else { return nil }
node.left = processNode(node.left)
node.right = processNode(node.right)
if toDeleteSet.contains(node.val) {
if let left = node.left { forest.append(left) }
if let right = node.right { forest.append(right) }
return nil
}
return node
}
let root = processNode(root)
if let root = root { forest.append(root) }
return forest
}
}Ставь 👍 и забирай 📚 Базу знаний