Хочу рассмотреть следующее двоичное дерево ( в данном случае — поисковое ):

двоичное дерево поиска

Рисунок — обыкновенное двоичное поисковое дерево

➡ Для начала надо понять, как нумеруются уровни дерева, на каком уровне лежит корневая вершина и т.п.

Следующая картинка дает ответы на подобные вопросы:

уровни двоичного дерева

Рисунок — уровни двоичного дерева

Из рисунка видно, что корневая вершина лежит на первом уровне. Иногда в теории алгоритмов нумерацию уровней бинарного дерева начинают с $0$. По-большему счету это непринципиально и мало влияет на логику алгоритма определения количества узлов на заданном уровне.

Визуально посчитаем количество вершин, а также их ключевые значения на каждом уровне рассматриваемого бинарного дерева и сведем информацию в сводную таблицу:

# уровня Количество вершин Значения вершин
$1$ $1$ $52$
$2$ $2$ $45,\ 125$
$3$ $3$ $24,\ 88,\ 154$
$4$ $4$ $61,\ 100,\ 132,\ 167$
$5$ $3$ $82,\ 102,\ 155$
$6$ $2$ $74,\ 118$
$7$ $0$ $—$

💡 Но хочу напомнить, что моя задача — написать программную функцию, которая вычисляет количество вершин на заданном ( $N$-ом ) уровне двоичного дерева.

То есть меня мало интересуют значения вершин ( ключевые данные ), а лишь их количество. Из этого следует, что мне не важно, является бинарное дерево поисковым или нет. Поэтому сейчас покажу анонимное двоичное дерево аналогичной топологии:

уровни анонимного двоичного дерева ( поиска )

Рисунок — уровни анонимного двоичного дерева ( поиска )

Например, пользователь «говорит», что хочет узнать количество вершин на $5$-ом уровне. Моя программная функция должна в качестве результата выдать ответ $3$, так как на уровне #$5$ находится три вершины:

на уровне #$5$ находится $3$ вершины

Рисунок — на уровне #$5$ находится $3$ вершины

➡ Если пользователь сделает запрос по номеру уровня, которого не существует в двоичном дереве, то программа должна выдать ответ $0$. Например, уровня #17 в анализируемом анонимном двоичном дереве нет физически, поэтому и узлов на этом уровне также нет физически.

Кстати, в одной из своих статей-шпаргалок я показывал, как реализовать поуровневый вывод вершин бинарного дерева ( поиска ). Мне пришлось задействовать классическую структуру данных «Очередь» ( Queue, FIFO — First-In, First-Out ). Весь процесс был построен итеративно, то есть без рекурсии. В текущем алгоритме ( нахождения количества узлов на заданном уровне ) мне не придется прибегать к вспомогательным структурам данных и, думаю, все реализую рекурсивно в одной компактной функции.

💡 Основная идея алгоритма определения количества узлов двоичного дерева ( поиска ) на заданном ( $N$-ом ) уровне: так как до каждой вершины дерева существует строго один путь от корневой вершины ( корень лежит на уровне #$1$ ), то я буду рекурсивно перебирать все пути до тех пор, пока не будет достигнут заданный уровень или NULL.

Под перебором я понимаю стандартный обход двоичного дерева. Всего их существует $6$ штук. Я выберу LKP-обход ( симметричный левый, левый-корень-правый ).

Если в процессе обхода дерева я вышел на заданный уровень, то дальше спускаться по дереву смысла нет, поэтому это будет окончанием рекурсивного спуска для текущего пути и в качестве ответа верну из функции $1$.

В результате закодировал на языке «чистый» Си следующую функцию, а также поставил детальные комментарии к каждой строке кода:

Вызов этой функции сделать можно так:

➡ Функция Nodes_count_on_target_level() является универсальной и она корректно работает, даже если на вход передать указатель на пустое двоичное дерево ( поиска ) — в этом случае ответ будет равен $0$, что абсолютно правильно.

Если в качестве заданного уровня передать недостижимый уровень, то функция также вернет $0$ и ошибок никаких не будет.

Еще такой момент: на самом деле функцию нахождения числа узлов на заданном уровне легко адаптировать, например, для поиска количества не всех узлов, а лишь полных узлов, листьев и т.п.

Пишите в комментариях, что непонятно в алгоритме нахождения количества элементов двоичного дерева ( поиска ), расположенных на заданном уровне. Если на практике вам приходилось сталкиваться с этим алгоритмом, то в рамках какой задачи — расскажите об этом.

ВНИМАНИЕ Для заказа программы на бинарное дерево ( поиска ) пишите на мой электронный адрес proglabs@mail.ru