Как работает красно-черное дерево?

есть много вопросов о красно-черных деревьях, но ни один из них не отвечает, как они работают. Почему его называют красно-черным? Как это держит дерево сбалансированным (тем самым увеличивая производительность по несбалансированному нормальному двоичному дереву поиска)? Я просто смотрю на представление, как и почему это работает.

2 ответов


для поиска и обхода это то же самое, что и любое двоичное дерево.

для вставок и удалений применяются более сложные алгоритмы, которые направлены на обеспечение того, чтобы дерево не было слишком несбалансированным. Они гарантируют, что все операции с одним элементом всегда будут выполняться в худшее время O (log n), тогда как в простом двоичном дереве двоичное дерево может стать настолько несбалансированным, что оно фактически является связанным списком, давая o (n) худшую производительность для каждого отдельного элемента операция.

основная идея красно-черного дерева-имитировать B-дерево с 3 ключами и 4 детьми на узел. B-деревья (или варианты, такие как B+ деревья) в основном используются для индексов базы данных и для данных, хранящихся на жестком диске.

каждый узел бинарного дерева имеет "цвет" - красный или черный. Каждый черный узел, по аналогии с B-деревом, является корнем поддерева для поддерева, которое помещается внутри этого узла B-дерева. Если этот узел имеет красные дочерние элементы, они также считаются частью одного и того же B-дерева узлов. Таким образом, можно (хотя и не на практике) преобразовать красно-черное дерево в B-дерево и обратно, сохранив (большую) структуру. Единственная возможная аномалия заключается в том, что когда узел B-дерева имеет два ключа и три дочерних, у вас есть выбор, какой ключ идет в черный узел в эквивалентном красно-черном дереве.

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

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

для Больше детали, следовать ссылка на Википедию что Мигдус уже поставлял.


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

[Я не верю, что запись Википедии делает этот момент ясным.]

обычные правила для красно-черных деревьев требуют, чтобы Красная Вершина никогда не указывала на другую красную вершину. Это средство что возможные расположения вершин для любого поддерева, укорененного черной вершиной (bbb, bbr, rbb, rbr -- for [left child][root][right child]), соответствуют 234 деревьям.

Поиск красно-черного дерева-это то же самое, что поиск обычного двоичного дерева. Вставка и удаление аналогичны, за исключением того, что в какой-то момент может потребоваться вращение" fix-up " для сохранения красно-черного инварианта.

Ура!