Может ли существовать любое действительное красно-черное дерево?

Предположим, у вас есть красно-черное дерево, которое является действительным двоичным деревом поиска и не нарушает ни одно из этих правил:

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

Такое красно-черное дерево выглядит так: enter image description here

Имеет ли каждое возможное дерево, отвечающее этим ограничениям, последовательность вложений и удалений, так что генерируется красно-черное дерево?

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

Если вы хотите протестировать контрпример: Вот реализация красно-черного дерева в python с реализованной функцией для генерации изображения.

Чтобы прояснить вопрос: мы делаем игру.

  • Я рисую красно-черное дерево, которое соответствует всем ограничениям.
  • Вы должны найти последовательность вложений и удалений, чтобы вы закончили с моим красным черным деревом.

Могу ли я рисовать красно-черное дерево, чтобы вы не смогли победить?

Цвета важны! Если дерево имеет другую форму или разные цвета, это не одно и то же красно-черное дерево.

Вы должны хотя бы знать, как сгенерировать эти два красно-черных дерева: enter image description hereenter image description here

Обратите внимание, что это только проверка для вас, если она может работать. Если вы только знаете, как получить эти два красно-черных дерева, вы не можете ответить на этот вопрос!

Ответ 1

Я считаю, что вставка узлов в обход ширины (уровень) приведет к красно-черному дереву.

http://en.wikipedia.org/wiki/Tree_traversal#Queue-based_level_order_traversal

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

13,8,17,1,11,15,25,6,22,27

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

http://en.wikipedia.org/wiki/Binary_tree#Types_of_binary_trees

Предположим, что дерево имеет три узла со значениями {1,2,3}, где "2" является корнем и по определению является черным. Узлы {1,3} могут быть либо черными, либо обоими красными, не нарушая красно-черных правил. Таким образом, вполне допустимая реализация красно-черной вставки может обнаружить, когда дерево "идеально" и цвет каждого узла черный. Такая реализация предотвратит возможность создания дерева, которое, например, чередуется с черным и красным на каждом уровне.

Изменить 2: Учитывая, что оба красно-чёрных дерева являются возможными входами (все три узла черные, а узлы 1 и 3 красные), это решает вопрос о необходимости удаления, если есть решение, тогда необходимо удаление. Теперь вопрос в моем сознании заключается в том, существует ли только один способ реализации вставки/удаления красно-черного дерева. Если их несколько, и если они дают разные деревья, то игроку игры нужно будет понять реализацию, чтобы указать порядок вставки и удаления для построения данного красно-черного дерева. Я не знаю достаточно о реализации красно-черных деревьев, чтобы ответить на вопрос, существует ли только один способ их реализации или существует ли более одного.

Ответ 2

Я думаю, что отрасль математики, которая занимается этим типом проблемы, представляет собой теорию графов, и изучая некоторые документы теории графов, которые проверяют свойства красного черного и других сбалансированных деревьев, я приведу к этой статье: http://www.math.unipd.it/~ baldan/Papers/Soft-copy-pdf/cosmicah05.pdf и http://www.math.unipd.it/~baldan/Papers/Soft-copy-pdf/cosmicah05.pdf и этот документ http ://citeseerx.ist.psu.edu/viewdoc/download? doi = 10.1.1.87.1161 & rep = rep1 & type = pdf, они должны иметь возможность отвечать на ваши запросы на абстрактные свойства. Или, по крайней мере, помогите вам рассказать свой вопрос таким образом, который приведет к еще большему количеству ресурсов.

Ответ 3

если дерево соответствует следующим правилам:

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

Это будет сбалансированное двоичное дерево и может называться красно-черным деревом.

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

Ответ 4

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

Я бы исчерпывающе рассмотрел все возможные под деревья с участием всех законных перестановок вокруг одного узла и доказал, что он может быть построен. Так:

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

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