Согласно википедии, существует биекция (соответствие 1:1) между двоичным деревом n - 2 узла и простая полигональная триангуляция n-vertex. Мне интересно, как преобразовать между собой*?
Другими словами, как преобразовать множество треугольников в двоичное дерево и как преобразовать двоичное дерево в множество треугольников? Треугольник представляет собой тройку вершин по часовой стрелке (v0, v1, v2) и соединяет соседние треугольники (n0, n1, n2).
* с точки зрения программиста, алгоритм, пример кода и т. д.
Как преобразовать бинарное дерево в полигональную триангуляцию и наоборот
Ответы (1)
Вот рекурсивная биекция.
Базовый случай состоит в том, что вырожденный двухвершинный многоугольник соответствует пустому дереву.
Индуктивно дерево имеет хотя бы один внутренний узел. Предположим, что вершины многоугольника имеют ранее существовавшие метки от 1 до n в порядке по часовой стрелке. Исследуйте уникальный треугольник T, содержащий ребро 12.
1-----2
/| /|\
/ | T / | \
6 | / | 3
\ | / | /
\|/ |/
5-----4
Если мы удалим T, мы получим два треугольных многоугольника. В этом случае мы получаем 2345 и 156. Рекурсивно биецируем многоугольник, включающий 1, чтобы получить левое поддерево корня. Рекурсивно биецируйте многоугольник, включая 2, чтобы получить правильное поддерево корня.
Особенно изящный способ увидеть эту биекцию состоит в том, что мы получаем дерево, беря планарный двойственный граф триангуляции, удаляя ребра, инцидентные бесконечной грани, и обозначая грань, смежную с 12, как корень.