Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2014, 19:34   #1
Skipper Ok
Пользователь
 
Аватар для Skipper Ok
 
Регистрация: 08.11.2013
Сообщений: 23
По умолчанию Деревья. Правильно ли работает программа!

Дано число N. Необходимо вычислить количество возможных двоичных деревьев, высота которых не превышает N. Каждый узел в дереве может либо не иметь ни одного потомка, либо иметь сразу двух потомков. Например, для N=1 возможно только одно дерево, состоящее из одного узла. Для N=2 возможны уже два варианта - либо дерево из одного узла, либо дерево из узла с двумя потомками. При этом высоты деревьев могут отличаться друг от друга.
Код:
uses crt;
var buf:array[1..100] of integer;
i,n:integer;
function f(n:integer):integer;
var res,i:integer;
begin
if buf[n] <> -1 then res:=buf[n] else
if n < 1 then res:=0
else if n = 1 then res:=1
else begin
res:=f(n-1);
for i:=1 to n-1 do res:=res+f(i);
end;
f:=res;
end;

begin
clrscr;
readln(n);
for i:=1 to n do begin
buf[i]:=-1;
buf[i]:=f(i);
end;
writeln(f(n));
end.
Skipper Ok вне форума Ответить с цитированием
Старый 09.01.2014, 01:49   #2
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Давайте начнем с условия:
Цитата:
Каждый узел в дереве может либо не иметь ни одного потомка, либо иметь сразу двух потомков.
Либо я чего-то не понимаю, либо же ни одно дерево с высотой от 2 и выше не будет удовлетворять данному условию.

Или все-таки допускается, что узел может иметь более 2 потомков, в таком случае это допустимо...
Но правильней было бы тогда указать в условии:
Цитата:
Каждый узел в дереве может либо не иметь ни одного потомка, либо иметь сразу двух потомков и более
Цитата:
Например, для N=1 возможно только одно дерево, состоящее из одного узла.
Да, но вы забыли про дерево с высотой 1 (по условию вашего задания ) - дерево с корнем по 1 потомку в каждом поддереве (бинарное дерево рассматриваем).

Последний раз редактировалось Базиля; 09.01.2014 в 02:00.
Базиля вне форума Ответить с цитированием
Старый 09.01.2014, 08:47   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Базиля, извините, но Вы не правы.

посмотрите теорию.
Да хоть ту же вики: Двоичное дерево
Цитата:
Сообщение от википедия
Двоичное дерево - древовидная структура данных, в которой каждый узел имеет не более двух потомков (детей). Как правило, первый называется родительским узлом, а дети называются левым и правым наследниками.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.01.2014, 09:31   #4
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

f(n) = f(n-1)^2 + 1
вроде так, но не доказано.
Sibedir вне форума Ответить с цитированием
Старый 09.01.2014, 16:16   #5
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Serge_Bliznykov
Цитата:
Базиля, извините, но Вы не правы.
посмотрите теорию.
Если говорить о потомке, то соответственно речь уже идет о потомстве. И любой узел, расположенный ПОД исходным узлом - есть его потомок

А если мы уже говорим о ребенке/сестре/брате, то здесь уже подразумеваем именно ПРЯМОЕ отношение к родительскому узлу и ни к какому иначе.
Базиля вне форума Ответить с цитированием
Старый 09.01.2014, 16:43   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Базиля Посмотреть сообщение
Serge_Bliznykov

Если говорить о потомке, то соответственно речь уже идет о потомстве. И любой узел, расположенный ПОД исходным узлом - есть его потомок

А если мы уже говорим о ребенке/сестре/брате, то здесь уже подразумеваем именно ПРЯМОЕ отношение к родительскому узлу и ни к какому иначе.
Т.е, Вы хотите сказать, что определение на википедии дано неверно?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.01.2014, 16:58   #7
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Нужно только определиться с понятием "потомок" в данном контексте.
Вы считаете что я не прав?
Базиля вне форума Ответить с цитированием
Старый 09.01.2014, 17:00   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Базиля Посмотреть сообщение
Нужно только определиться с понятием "потомок" в данном контексте.
Вы считаете что я не прав?
согласен.
Только вот значение "потомок" в исходном посте TC совпадает со значением в определении (на вики, например): - это только "дети" (внуки и правнуки не участвуют в данном случае).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.01.2014, 21:01   #9
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Базиля, извините, но Вы не правы.
Я за Базилю. Перед тем, как давать такое задание(на форуме) стоит четко определить что понимает ТС или его препод под терминами из условия..
Цитата:
8Реферат: Представление бинарного дерева в виде массива - Xreferat.ru...
Сыновья узла и сыновья их сыновей называются потомками (descendants), а родители и прародители – предками (ancestors) этого … Д. Кнут Искусство программирования для ЭВМ. Т1, Основные алгоритмы. … Понятие достижимости в теории графов, их математические свойства.
xreferat.ru›54/2450-1-predstavlenie-binarnogo-… копия ещё
уж простите за то, что в таком виде.. На планшет не очень удобен для таких дел

О самой задаче : очевидно, что тут будет рекурентная формула.. А вот какая - надо думать.
Poma][a вне форума Ответить с цитированием
Старый 09.01.2014, 22:14   #10
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

О решении : для начала я вынужден не согласиться с ТС. Для N = 2 возможны три варианта : один корень, корень и еще одна вершина, соединенная с ним, и полное бинарное дерево..

Далее.. Пусть у нас есть решения для i-той высоты. Тогда найдем решение для i+1. Это будут все решения для i + построим такое дерево : у каждого узла только один сын. И таких узлов ровно i. Теперь будем прибавлять к каждой вершине, начиная с корня, еще одного такого сына. Таким макаром мы добавим еще i+1 вариант.
И тогда решением будет сумма от i = 1 до n самих i. (А теперь запихнем это в арифметическую прогрессию. И получим (n+1)*n/2
Poma][a вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Правильно ли работает программа на C++ hirano Помощь студентам 0 13.03.2012 11:46
правильно ли работает программа? ITdocer Паскаль, Turbo Pascal, PascalABC.NET 2 04.11.2011 09:37
Программа работает не правильно artem611 Паскаль, Turbo Pascal, PascalABC.NET 2 22.09.2010 07:49
программа работает. правильно ли? getUp Общие вопросы C/C++ 10 26.03.2010 07:07
Не правильно работает программа Virus_L Помощь студентам 0 28.12.2009 22:52