Проверить полноту двоичного дерева

Дан корень бинарного дерева. Определить, являтеся ли дерево полным.

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

Пример 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(); // если очередь пуста, дерево полное
    }

Комментарии

Популярные сообщения из этого блога

Разбиение числа на сумму с максимальным произведнием слагаемых

Число подмассивов, в которых сумма элементов равна k

Сложить два числа, которые представлены списком