Вычислить глубину бинарного дерева поиска?

голоса
0

У меня возникают трудности вычисления суммирования глубины [сумма отдельных глубин для всех детей корня] для данного BST. У меня есть общее количество узлов для дерева, и я пытаюсь вычислить среднюю глубину для дерева, требуя у меня есть эта глубина сумма.

Рекурсия, и я не очень хорошо ладят .. Я нахожу эту проблему очень сложно. Я хотел бы видеть рекурсивное решение, хотя, если это возможно.

ЗАМЕТКА:

Я создал Accessors Node.getLeft () и Node.getRight ()

Задан 09/12/2009 в 21:03
источник пользователем
На других языках...                            


5 ответов

голоса
2

Подумайте о том, как вы бы об этом канонически стороны, если бы я представил картину BST к вам на листе бумаги. Когда вы находитесь на узле, какую информацию вам нужно следить? Как один найти высоту данного узла?

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

Ответил 09/12/2009 в 21:08
источник пользователем

голоса
4

Вам просто нужно держать счетчик глубины, как вы обход дерева (искать дерево обходы, если вам нужно) и добавить значение счетчика каждый раз, когда вы достигаете узел. Тогда просто разделить на число узлов.

Это выглядит как домашнее задание, так что я не обеспечивая более подробное решение.

Ответил 09/12/2009 в 21:09
источник пользователем

голоса
0

Является ли это домашнее задание? Если это так пометить вопрос как таковой.

Вы можете создать метод, который:

  • имеет опорный узел и глубину в качестве аргументов
  • приращение глубины
  • если узел не является вызов дочернего узла рекурсивен для левой и правой и обновления суммы соответственно
  • в противном случае вернуть сумму + глубину

После того как вы это разделим на число детей в дереве, чтобы получить среднюю глубину.

Ответил 09/12/2009 в 21:10
источник пользователем

голоса
0

Мы должны посетить все узлы листьев и выяснить, насколько глубоко они. Это предполагает:

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

Теперь один из 2-х вещей может произойти:

  • Либо узел вы нашли это листовой узел, т.е. не имеет детей; в этом случае, ваш посетитель должен вернуть его глубину вызывающего абонента. Да, он просто возвращает номер он получил от абонента, + 1.

  • или это не листовой узел. В этом случае она будет иметь 1 или 2 детей. Нам нужно, чтобы получить эти подробные отчеты от наших детей обратно к абоненту, так просто вернуть сумму глубин, возвращенных детьми.

К магии рекурсии число возвращается к посетителю в корне будет суммой глубин всех детей.

Для того, чтобы получить среднюю глубину, вы хотите, чтобы разделить это на количество конечных узлов; который я оставил бы на второй обходе для расчета. Это может быть сделано в одном, но это будет немного сложнее.

Ответил 09/12/2009 в 21:26
источник пользователем

голоса
0

Поскольку это домашнее задание, я не хочу, чтобы просто дать вам ответ. Вместо этого, здесь рекурсивный способ вычислить длину односвязного списка. Надеюсь, это продемонстрирует рекурсию таким образом, вы можете понять, и вы можете экстраполировать оттуда, чтобы решить вашу проблему BST.

public final class LL {
    public final int value;
    public LL next;

    public LL(final int value) {
        this.value = value;
    }

    public void add(final int value) {
        if (null == next) {
            next = new LL(value);
        } else {
            next.add(value);
        }
    }

    /**
     * Calculate the length of the linked list with this node as its head (includes this node in the count).
     *
     * @return the length.
     */
    public int length() {
        if (null == next) {
            return 1;
        }
        return 1 + next.length();
    }

    public static void main(final String... args) {
        final LL head = new LL(1);
        head.add(2);
        head.add(3);
        System.out.println(head.length());
        System.out.println(head.next.length());
    }
}
Ответил 09/12/2009 в 21:57
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more