Алгоритм динамического программирования

Бинарное дерево T является полусбалансированным, если для каждого узла m в T:

R(m)/2 <= L(m) <= 2*R(m),

где L (m) - количество узлов в левом поддереве m, а R (m) - количество узлов в правом поддереве m.

(a) Напишите рекуррентное соотношение для подсчета количества полусбалансированных двоичных деревьев с N узлами.

(b) Предоставьте алгоритм динамического программирования для вычисления повторения в (a).

Как мне сделать для этого отношение повторения?

Подходит ли следующее?

if(node==NULL)
return;
if(given relation is true)
count++
else find for right tree;
     find for left tree;

Я предполагаю, что он спрашивает больше о рекуррентном отношении, таком как функция или что-то в этом роде.?

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

Пожалуйста, помогите.


person Kraken    schedule 10.11.2011    source источник


Ответы (1)


Подсказка: Пусть C(n) будет числом полусбалансированных деревьев с n узлами. Если вы знаете значения для C(1), C(2), ..., C(n), то легко вычислить C(n+1), взяв корневой узел и разделив оставшиеся n узлы на левое и правое поддеревья в соответствии с указанным условием.

Количество узлов в поддеревьях может быть от n/3 до 2*n/3, поскольку эти значения удовлетворяют условию R(n)/2 <= L(n) <= 2*R(n).

Обновление:

C(n) = sum from n/3 to 2n/3 L(n)*R(n)

person Ante    schedule 10.11.2011
comment
@aksam Какой пример вы ищете? Код повторения или пример расчета? - person Ante; 06.04.2016
comment
Я не понимаю, как сочетаются повторения. скажем, мы знаем число C (1) двоичного дерева полубаланса с 1 узлом, как мы можем найти число C (2) двоичного дерева полубаланса с 1 узлом? - person akashchandrakar; 07.04.2016
comment
@aksam Я обновил ответ. C (n) - это сумма всех возможных комбинаций поддеревьев L и R. - person Ante; 08.04.2016