2012-02-11 5 views
1

Предположим, у меня есть связанный список положительных чисел, сколько из них BST могут быть сгенерированы из них, при условии, что все узлы все, необходимые для формирования дерева?Число связанных с BST связанных списков чисел

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

Бонус: сколько сбалансированных BST можно сформировать? Любая помощь или руководство получают большую оценку.

+0

в порядке, поэтому переезд BST ведет по упорядоченному списку? поэтому я подумал, что мы можем разложить qn на «сколько способов сортировать связанный список». это будет nCn + nC (n-1) + ... + nC1, что будет ответом на второй вопрос. ответ на первый qn будет n. третий qn, im не совсем уверен. – OckhamsRazor

+0

Возможный дубликат [Определить количество возможных деревьев из заданных узлов] (http://stackoverflow.com/questions/9238440/determine-number-of-possible-tree-from-given-nodes) –

ответ

0

Вы можете использовать динамическое программирование для вычисления этого.

Просто отметьте, что неважно, какие цифры, сколько именно. Другими словами, для любых n различных целых чисел существует одинаковое количество разных BST. Назовем это число f (n).

Тогда, если вы знаете, F (K) для к < п, можно получить п (п):

f(n) = Sum (f(i) + f(n-1-i), i = 0,1,2,...,n-1) 

Каждое слагаемое представляет собой количество деревьев, для которых (1 + I) -го Наименьшее число находится в корне (таким образом, в левом поддереве, где находятся числа i, а в правом поддереве есть n-1-i). Итак, DP решает это.

Сейчас общее количество BSTs (с любыми узлами из списка) является только сумма:

Sum (Binomial(n,k) * f(k), k=1,2,3,...,n) 

Это потому, что вы можете выбрать к из них в Binomial(n,k) способами, и тогда вы знаете, что есть f(k) BST для них.