DEV Community

faangmaster
faangmaster

Posted on • Edited on

Максимальная высота дерева

Ссылка на leetcode: https://leetcode.com/problems/maximum-depth-of-binary-tree/description/

Задача. Дано бинарное дерево. Найти его максимальную высоту.

Например, для дерева

Ответ 4.

Решение. Будем использовать in-order алгоритм обхода бинарного дерева (Алгоритмы обхода двоичного дерева):

    public static void dfs(BinaryTree tree) {
      if (tree == null) {
        return;
      }
      visit(tree);
      dfs(tree.left);
      dfs(tree.right);
    }
Enter fullscreen mode Exit fullscreen mode

Вариант 1 решения. Будем высоту считать снизу вверх. Когда достигли листовой вершины (нет дочерних верших), то вернем ноль. Для каждой вершины будем находить максимальную глубину между левой и правой подветкой и прибавлять 1 к результату.

    class Solution {
        public int maxDepth(TreeNode root) {
            if (root == null) {
                return 0;
            }
            int leftDepth = maxDepth(root.left);
            int rightDepth = maxDepth(root.right);
            return Math.max(leftDepth, rightDepth) + 1;
        }
    }
Enter fullscreen mode Exit fullscreen mode

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

Вариант 2. Считаем высоту сверху вниз, высоту передаем в качестве параметра функции. Сохраняем результат в глобальной переменной.

    class Solution {
        int max = 0;
        public int maxDepth(TreeNode root) {
            //Высота корня дерева = 1
            traverse(root, 1);
            return max;
        }

        private void traverse(TreeNode root, int height) {
            if (root == null) {
                return;
            }
            //обновляем максимум
            max = Math.max(max, height);
            //рекурсивный вызов для левой и правой вершины
            traverse(root.left, height + 1);
            traverse(root.right, height + 1);
        }
    }
Enter fullscreen mode Exit fullscreen mode

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

    class Solution {
        public int maxDepth(TreeNode root) {
            //Высота корня дерева = 1
            return dfs(root, 1);
        }

        private int dfs(TreeNode root, int height) {
            if (root == null) {
                return height - 1;
            }
            //рекурсивный вызов для левой и правой вершины
            int leftHeight = dfs(root.left, height + 1);
            int rightHeight = dfs(root.right, height + 1);

            return Math.max(leftHeight, rightHeight);
        }
    }
Enter fullscreen mode Exit fullscreen mode

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay