| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Object Pascal: кроссплатформенные технологии > Двоичное дерево - вычисление характеристик |
| Автор: BCworm 21.7.2008, 08:37 | ||||
| Приветствую! У меня вот такая проблема. Необходимо написать процедуры для вычисления свойства двоичного дерева. Само дерево у меня вроде бы получается. обход с лева на право вроде тоже с выводом элементов. Но мне еще необходимо вычислить размер дерева, высоту дерева, и вычислить контрольную сумму. Естественно первым делом перечитал кучу одинаковых букварей и вот что удалось родить в муках.
У меня есть схема необходимых алгоритмов на псевдокоде но я никак не могу до конца его понять. Помогите пожалуйста. Вот к примеру алгоритм вычисления размера дерева Определение размера дерева. Видно что используется рекурсия. Моя интерпритация -это процедура TSize но конечно же не все так просто. Size(p:pVertex) IF(p = NIL) := 0 ELSE Size := 1 + Size (pLeft)+ Size (pRight) FI
А вот к примеру определение высоты дерева Height(p:pVertex) IF(p = NIL) Height := 0 ELSE Height := 1+ max(Height(pLeft), Height(pRight)) В общем очевидно что мы с компилятором имеем разные мнения о правильности написания кода |
| Автор: Dobermann 21.7.2008, 09:29 |
| У тебя не дерево - это двунаправленный список!!! |
| Автор: BCworm 21.7.2008, 09:56 |
| Я делал по этому псевдокоду. Где ошибка то? Или в добавлении элемента к дереву? type pVertex = ^tVertex; Vertex =record; tData: integer; Left: pVertex; Right: pVertex; end; VAR Root: pVertex; |
| Автор: Dobermann 21.7.2008, 22:45 |
| Я тебе говорю, в деревьях добавляется еще и индекс элемента!!! Иначе какой обход?!?!?! |
| Автор: BCworm 22.7.2008, 03:09 |
| Хм. Уже везде все перерыл но нигде не нашел про индексы. Нашел еще несколько примеров инициализации, построения и обхода дерева но все они принципиально одинаковы только названия переменных разные. К примеру вот это http://www.rusedu.info/Article520.html. Уже не знаю чему верить :( |
| Автор: Dobermann 22.7.2008, 06:47 |
| Забудь! Индексы добавляются для поиска! |
| Автор: BCworm 22.7.2008, 07:01 | ||
| Во! я вот тоже седня читал читал, какието намеки были Но это проблемы не решает. Мне бы с процедурами разобраться. о которых я выше писал. размер дерева высота. Проблема очевидно в том что неправильно интерпретирую псевдокод. К примеру вот Size(p:pVertex) IF(p = NIL) := 0 ELSE Size := 1 + Size (pLeft)+ Size (pRight) FI Я вот написал вот так. но в чем моя ошибка? Естественно размер дерева нужно будет потом вывести. А как? write(Tsize) явно не так :(
|
| Автор: Dobermann 22.7.2008, 07:16 |
| Добавь тогда индекс для подсчёта высоты... Т.е. с каждым номым обходом добавляй единицу. Размер дерева - кол-во его узлов??? |
| Автор: volvo877 22.7.2008, 08:18 | ||||
Естественно... Вот и выведешь:
P.S. Не надо никаких дополнительных индексов, высота прекрасно считается и без них... |
| Автор: BCworm 22.7.2008, 10:26 |
| Ну вот же. Вот же оно! Вроде начинаю прояснятся! |
| Автор: BCworm 23.7.2008, 08:17 | ||
| Ну вот дошло дело и до определения высоты дерева. Там нужно использовать функцию судя по всему там нужно использовать функцию max. Я написал вот такую функцию. Даже при подключенном math судя по всему нужно объяснить компилятору что означает буквосочетание max в моем коде. А как?
|
| Автор: volvo877 23.7.2008, 11:24 | ||
Разделом не ошибся? Где ты в стандартном Паскале видел модуль Math? Напиши свою функцию:
Можно уточнить, откуда у тебя этот "твой" код? Ибо если ты не знаешь, что в "твоем" коде означает max, то этот код совсем не твой, а скопированный тобой... Не присваивай себе чужого никогда... |
| Автор: BCworm 24.7.2008, 01:28 | ||
Да я по псевдокоду это все сочиняю поэтому вот увидел там max и подумал что надо эту функцию использовать. Порыл гугль а там вроде как написано что есть некий модуль math... |
| Автор: BCworm 25.7.2008, 08:47 |
| И опять тупик. Осталось вычислить среднюю высоту дерева. А у меня нет ни псевдокода ни примера ни даже малейшего намека как это сделать :(. Гугль молчит. Может можно где нить почитать? Рассуждая логически предположу что если высота дерева это длинна самой длинной ветки, то средняя высота эта наверное сумма всех этих путей со всех веток поделенная ... а на что поделенная то? на корень дерева? на количество ветвей? нигде ничего толком как будто я сам все это придумал и до меня никого это не волновало :( |
| Автор: volvo877 25.7.2008, 12:09 |
| Это сумма длин путей от корня до КАЖДОГО листа (узла, не имеющего потомков), поделенная на количество листов... |
| Автор: Pini3n 26.7.2008, 19:30 | ||
В паскале есть такой модуль!!!!!!!!!!!! |
| Автор: volvo877 27.7.2008, 09:35 |
| В дистрибутиве Турбо Паскаля версии 7.0 нет модуля math. А если ты пользуешься самопальными (или установленными дополнительно) модулями - об этом надо говорить. Возможно, у тебя установлен модуль от Norbert Juffa, но это опять же стороннее ПО. И прекрати оффтопить, тема не о том, есть ли в Паскале модуль math... |
| Автор: Pini3n 27.7.2008, 18:22 | ||
http://forum.woweb.ru/topic6973.html
|
| Автор: volvo877 27.7.2008, 19:12 |
| Pini3n, я предупреждал тебя насчет оффтопа? Теперь не обижайся! Турбо Паскаль (о котором говорится здесь) и Object Pascal (о котором говорится в разделе Дельфи) - это совсем не одно и то же. Если ты не видишь этой разницы - не значит, что ее нет! Итог: Тема закрыта как замусоренная оффтопом, автор "горячо благодарит" за это "всезнающего" пользователя с ником Pini3n Dixi. |