Подсчет бинарных деревьев

28

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

Глядя на страницу Википедии о бинарных деревьях , я заметил это утверждение, что число корневых бинарных деревьев размером n будет таким каталонским числом :

Cn=1n+1(2nn)

Но я не понимаю, как я мог придумать такой результат сам? Есть ли способ найти этот результат?

Теперь, что если порядок поддеревьев (слева, то справа) не учитывается? Например, с моей точки зрения, я считаю, что эти два дерева одинаковы:

   /\   /\
  /\     /\

Можно ли применить подобный метод для подсчета, сколько из этих объектов имеет ровно n узлов?

Стефан Хименес
источник
Применима ли здесь теорема Поли о укорененных 2-арных деревьях?
Николас Манкузо

Ответы:

35

Для подсчета многих типов комбинаторных объектов, таких как деревья в данном случае, существуют мощные математические инструменты (символический метод), которые позволяют механически получить такие счетчики из описания того, как строятся комбинаторные объекты. Это включает в себя создание функций.

Отличным примером является аналитическая комбинаторика покойного Филиппа Флажолета и Роберта Седжвика. Это доступно по ссылке выше.

Книга покойной Герберта Уилфа, генерирующая функциональность, является еще одним бесплатным источником.

И, конечно, « Конкретная математика» от GKP - это клад.


Для бинарных деревьев это выглядит так: сначала вам нужно четкое определение дерева.

Бинарное дерево - это корневое дерево, в котором каждый неконечный узел точно имеет степень 2.

Далее мы должны договориться о том, что мы хотим назвать размером дерева.

введите описание изображения здесь

Слева все узлы равны. В середине мы различаем листья и не листья. Справа у нас есть обрезанное бинарное дерево, листья которого были удалены. Обратите внимание, что у него есть одинарные ветви двух типов (слева и справа)!

Теперь мы должны получить описание того, как эти комбинаторные объекты строятся. В случае бинарных деревьев возможна рекурсивная декомпозиция .

Пусть будет множеством всех двоичных деревьев первого типа, тогда символически мы имеем: Aвведите описание изображения здесь

Он гласит: «Объект класса двоичных деревьев - это либо узел, либо узел, за которым следуют два двоичных дерева». Это можно записать как уравнение множеств:

A={}({}×A×A)

Вводя производящую функцию которая перечисляет этот класс комбинаторных объектов, мы можем преобразовать заданное уравнение в уравнение, содержащее производящую функцию.A(z)

A(z)=z+zA2(z)

Наш выбор одинаковой обработки всех узлов и определения количества узлов в дереве как понятия его размера выражается «маркировкой» узлов переменной .z

Теперь мы можем решить квадратное уравнение для и получить, как обычно, два решения явной замкнутой формы производящей функции:zA2(z)A(z)+z=0A(z)

A(z)=1±14z22z

Теперь нам просто нужна (обобщенная) теорема Ньютона:

(1+x)a=k=0(ak)xk

с и чтобы разложить замкнутую форму производящей функции обратно в степенной ряд. Мы делаем это потому, что коэффициент в - это просто число комбинаторных объектов размера , обычно записываемых как . Но здесь наше представление о «размере» дерева заставляет нас искать коэффициент при . После небольшого манипулирования с биномами и факториалами мы получаем:a=1/2x=4z2znn[zn]A(z)z2n+1

[z2n+1]A(z)=1n+1(2nn).

Если мы начнем со второго понятия размера, рекурсивная декомпозиция будет:

введите описание изображения здесь

Мы получаем другой класс комбинаторных объектов . Он гласит: «Объектом класса двоичных деревьев является либо лист, либо внутренний узел, за которым следуют два двоичных дерева».B

Мы можем использовать тот же подход и превратить в . Только на этот раз переменная отмечает только внутренние узлы, а не листья, потому что здесь определение «размер» отличается. Мы также получаем другую функцию генерации:B={}({}×B×B)B=1+zB2(z)z

B(z)=114z2z

Извлечение коэффициента урожайности

[zn]B(z)=1n+1(2nn).

Классы и согласуются по количеству, потому что бинарное дерево с внутренними узлами имеет лист, таким образом, всего узел.ABnn+12n+1

В последнем случае нам придется работать немного усерднее:

введите описание изображения здесь

который является описанием непустых сокращенных двоичных попыток. Мы расширяем это до

C={}({}×C)({}×C)({}×C×C)D={ϵ}({}×C×C)

и переписать его с генерирующими функциями

C(z)=z+2zC(z)+zC2(z)D(z)=1+zC2(z)

решить квадратные уравнения

C(z)=12z14z2zD(z)=114z2z

и получить еще раз

[zn]C(z)=1n+1(2nn)n1[zn]D(z)=1n+1(2nn)n0

Обратите внимание , что функция генерирования Каталонский является

E(z)=114z2

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

E={}×SEQ(E)

Он гласит: «Объект класса общих деревьев - это узел, за которым следует возможная пустая последовательность общих деревьев».

E(z)=z1E(z)

С формулой обращения Лагранжа-Бюрмана мы получаем

[zn]E(z)=1n+1(2nn)

Итак, мы доказали, что существует столько общих деревьев, сколько существует двоичных деревьев. Неудивительно, что между общим и бинарным деревьями существует биекция. Биекция известна как вращательная корреспонденция (объясненная в конце связанной статьи), которая позволяет нам хранить каждое общее дерево как двоичное дерево.

Обратите внимание, что если мы не различаем левого и правого родного брата в классе мы получаем еще один класс деревьев :CT

введите описание изображения здесь

одинарные бинарные деревья. У них тоже есть производящая функция однако их коэффициент отличается. Вы получаете числа Моцкина

T={}×SEQ2(T)
T(z)=1z12z3z22z
[zn]T(z)=1nk(nk)(nkk1).

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

улы
источник
Просто отметим, что «Введение в анализ алгоритмов» Седжвика и Флайолета ( aofa.cs.princeton.edu ) охватывает много того же материала, что и книга «Аналитическая комбинаторика», но в более доступной форме.
vonbrand
7

Генерирующие функции - очень мощная и очень полезная волшебная палочка. Следующее решение первого вопроса (почему существуют деревья ) несколько менее волшебно. Следовательно, милый.Cn

Пример. Чтобы создать дерево из узлов, мы начинаем с последовательности, в которой встречается раз, а встречается раз. Например, . Среди префиксов с наименьшей (и, возможно, отрицательной) суммой выберите самый длинный; в этом случае . Возьмите этот префикс с начала и поместите его в конец; в этом случае мы получаем . Теперь измените на и на ; в этом случае мы получаем . Удалить с самого начала, добавить5+15+115+++++++++++++++++TETTETETTETEETEв конце; в этом случае мы получаем TETETTETEEE. Это описание дерева T(E,T(E,T(T(E,T(E,E)),E))). Ниже приведено объяснение, почему это биекция. Как только вы убедитесь в этом, считать легко. Есть последовательностей , затем мы разделили на потому что мы выбрали одну из возможных циклических перестановок.(5+65)±15+6

Первая биекция. Типичное определение для деревьев в МЛ type tree = T of tree * tree | E; то есть дерево либо имеет два (упорядоченных) поддерева, либо оно пустое. Вот как деревья построены: T(T(E,E),T(T(E,E),T(E,E))). Сбрасывая пух, мы можем просто написать TTEETTEETEE. Все эти описания будут заканчиваться строкой E, поэтому он является излишним: TTEETTEETE. (Обратите внимание, что пустое дерево теперь соответствует пустой строке.) Эти строки имеют свойство, заключающееся в том, что каждый префикс имеет по меньшей мере столько же Ts, сколько Es, и в общей сложности они имеют Ts и Es, где - количество узлов дерево.nnn

Вторая биекция. Теперь мы заменим T на +1, а E на -1. Итак, мы смотрим на последовательности с значениями +1, с значениями -1 и суммами всех префиксов .nn0

Третья биекция. Теперь мы немного изменим требование к префиксам: мы просим, ​​чтобы сумма каждого непустого префикса была . Чтобы это было возможно, мы допустим значений +1 и значений -1. (В противном случае сумма всей строки будет равна 0 и не будет соответствовать условию для префиксов.) Эти последовательности должны начинаться с +1. Таким образом, они действительно такие же, как и раньше, за исключением того, что в начале они застряли +1>0n+1n

Реней собственности. Теперь забыть наши последовательности на мгновение и рассмотрят некоторую конечная последовательность целых чисел , , сумма которых составляет 1. Если все непустые префиксы имеют положительные суммы, то нет циклической перестановка этой последовательности имеет то же свойство. Зачем? Хорошо, предположим, что существует такое что также имеет все непустые префиксы положительные. Тогда (свойство последовательности, начинающейся с ) и (свойство последовательности, начинающейся с ); следовательно,x1xmk1xk,,xm,x1,,xk1x1++xk11x1xk++xm1xkx1++xm2, что противоречит предположению, что сумма для всей последовательности равна 1.

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

Вывод. Теперь давайте посчитаем последовательности +1 и -1, которые находятся в биекции с деревьями. Из чисел мы должны выбрать , равный +1, остальные будут -1. Есть способов сделать это. Но только из подсчитанных последовательностей имеет положительные префиксы. Итак, число корневых упорядоченных бинарных деревьев равно:2n+1n+1(2n+1n+1)12n+1

12n+1(2n+1n+1)=12n+12n+1n+1(2nn)=1n+1(2nn)
rgrig
источник
Очень хороший ответ, но следующее утверждение требует некоторого объяснения: «учитывая некоторую последовательность с суммой 1, всегда существует циклическая перестановка, которая делает все непустые префиксы положительными»: по крайней мере, намек на доказательство был бы хороший.
Vog
1
@vog: возьмите префикс с наименьшей суммой и переместите его до конца.
rgrig
1
@vog: это также должен быть самый длинный префикс, если есть несколько с одинаковой наименьшей суммой. Я отредактировал ответ, чтобы добавить пример в начале.
rgrig