Высота красно-черного дерева с использованием рекурсии

0

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

int RedBlackTree::heightHelper(Node * n) const{
        if ( n == NULL ){
            return -1;
        }
        else{
            return max(heightHelper(n->left), heightHelper(n->right)) + 1;
        }
    }

int RedBlackTree::max(int x, int y) const{
    if (x >= y){
        return x;
    }
    else{
        return y;
    }
}
  • 0
    Подумайте о том, что + 1 вы видите в конце этого max() результата в результате рекурсивных вызовов, и что он вносит в вызывающую сторону текущего вызова.
  • 0
    Попробуйте сначала смоделировать работу алгоритма с очень простыми деревьями. Как это работает, если существует только рут? Как это работает в дереве с узлами дерева?
Показать ещё 1 комментарий
Теги:
recursion
red-black-tree

4 ответа

3
Лучший ответ

Ну, общий алгоритм поиска высоты любого двоичного дерева (будь то BST, AVL дерево, красный черный и т.д.) Выглядит следующим образом

For the current node:
 if(node is NULL) return -1
 else
    h1=Height of your left child//A Recursive call
    h2=Height of your right child//A Recursive call
    Add 1 to max(h1,h2) to account for the current node
    return this value to parent.

Иллюстрация к приведенному выше алгоритму выглядит следующим образом:

Изображение 174551

(Изображение предоставлено Wikipedia.org)

1

Этот код вернет высоту любого двоичного дерева, а не только красно-черного дерева. Он работает рекурсивно.

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

Высота дерева проходит через левую или правую ветвь, поэтому мы можем взять максимум этих. Затем добавим 1 для корня.

Обращайтесь с базовым регистром дерева (-1), и мы закончили.

1

Это основной алгоритм рекурсии.

Начните с базового случая, если корень равен null высота дерева - -1 поскольку дерево не существует.

Теперь представьте себе на любом узле, какова будет высота дерева, если этот узел был его корнем?

Это будет просто максимум высоты левого поддерева или правого поддерева (так как вы пытаетесь найти максимально возможную высоту, поэтому вам нужно взять больше из 2) и добавить 1 к нему, чтобы включить сам узел,

Что это, как только вы последуете этому, вы закончили!

1

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

    A

Здесь стек вызовов выглядит следующим образом:

height(A) = 
   max(height(A->left), height(A->right)) + 1

Так как левые и правые нулевые, оба возвращаются (-1), и поэтому это сводится к

height(A) = max (-1, -1) + 1;
height(A) = -1 + 1;
height(A) = 0

Немного более сложная версия

         A
    B         C
  D   E

Рекурсивные вызовы, о которых мы заботимся, таковы:

height(A) = 
    max(height(B), height(C)) + 1

height(B) = 
    max(height(D), height(E)) + 1

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

height(A) = max( (max(0, 0) + 1), 0) + 1
height(A) = max(1, 0) + 1
height(A) = 1 + 1
height(A) = 2

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню