Проверить полноту двоичного дерева
Дан корень бинарного дерева. Определить, являтеся ли дерево полным.
В полном бинарном дереве каждый уровень, за исклением возможно последнего (с листьями), полностью заполен. Если последний уровень не заполнен, то все его элементы занимают все левые позиции.
Пример 1:

Дано: root = [1,2,3,4,5,6] Результат: true Пояснение: Каждый уровень дерева, за исключением нижнего, заполнен. Самый нижний уровень имеет пробелы только справа.
Пример 2:

Дано: root = [1,2,3,4,5,null,7] Результат: false Пояснение: Узел с числом 7 следует за "дыркой", которая находится левее его.
Ограничения:
- Количество вершин в дереве находится в интервале
[1, 100]. 1 <= Node.val <= 1000
Идея решения
Будем обходить дерево по BFS, и на каждом уровне будем добавлять в очередь левое и правое поддерево рассматриваемой вершины, даже если они нулевые.
Если дерево полное, то после рассмотрения всех вершин в очереди останутся только нулевые элементы. В противном случае, дерево не полное, а с "дырками".
Имплементация
public boolean isCompleteTree(TreeNode root) {
Queue<TreeNode> bfs = new LinkedList<TreeNode>();
bfs.offer(root);
while (bfs.peek() != null) { // если это не нулевой элемент
// то у него могут быть поддеревья или нулевые поддеревья,
// мы добавим их в очередь в любом случае
TreeNode node = bfs.poll();
bfs.offer(node.left);
bfs.offer(node.right);
}
// убираем из очереди все нулевые элементы, пока не достигнем хвоста или ненулевой элемент
while (!bfs.isEmpty() && bfs.peek() == null)
bfs.poll();
return bfs.isEmpty(); // если очередь пуста, дерево полное
}
Комментарии
Отправить комментарий