Задачка на алгоритмы

Всем привет. Решил разобрать пример похожей задачи которая не позволила мне пройти следующий этап собеса в Яндекс и методику решения подобных задач. Т.к. поняв методику можно в целом решить любую подобного рода задачу.

Итак мне досталась задача на обход графа, а если быть точнее дерева.

Дан корень root двоичного дерева, верните его максимальную глубину. Максимальная глубина двоичного дерева - это количество узлов в самом длинном пути от корневого узла до самого дальнего листового узла.

Подобного рода задачи можно решить либо итеративно либо рекурсивно. Я выбрал рекурсию вспомнил что есть такой алгоритм dfs поиск в глубину. Чтобы решать такие задачи нужно вообще знать что такое рекурсия, база рекурсии, и когда собственно вызывать эту самую рекурсию. Рекурсия - это метод решения задачи, при котором функция вызывает саму себя для решения подзадачи того же типа. База рекурсии - это условие выхода из функции. Объясню на каноническом примере с факториалом

fun factorial(n: Int): Long { // База рекурсии if (n <= 1) { return 1 } // Рекурсивный случай - функция вызывает саму себя return n * factorial(n - 1) }

Итак нам нужно вернуть максимальную глубину двоичного дерева

class Solution {     fun maxDepth(root: TreeNode?): Int {         return dfs(root,0)     }

fun dfs(root: TreeNode?, level: Int) : Int { // База рекурсии если root == null значит его родитель это листовой узел дерева.         if(root == null) {             return level         }

//Запускаем рекурсию для левого и правого поддерева         val leftLevel = dfs(root.left,level+1)         val rightLevel = dfs(root.right,level+1)

//Возвращаем максимальный уровень         return maxOf(leftLevel,rightLevel)     } }

P.S. На собесе же в моем случае дерево было не двоичное и нужно было вернуть узел максимальной глубины.

#алгоритмы #яндекс

Задачка на алгоритмы | Сетка — социальная сеть от hh.ru