|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Теория - Подсчёт узлов двоичного дерева рекурсивной функцией |
|
Теория - Подсчёт узлов двоичного дерева рекурсивной функцией
|
Пользователь Сообщения: 100 |
Профиль | Отправить PM | Цитировать Помогите, пжлст, найти ошибку.
Turbo Pascal 5.5 type tRefBinTree = ^tBinTree; tBinTree = record info : integer; left : tRefBinTree; right : tRefBinTree; end; function Nodes (inRefRoot : tRefBinBauTree) : integer; begin if (inRefRoot <> nil) then writeln(inRefRoot^.info); правильно выводит все содержащиеся в дереве числа Nodes := 1 + Nodes(inrefRoot^.left) + Nodes(inrefRoot^.right) Возвращает разные большие отрицательные числа, -6ххх и др. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ end end; |
|
Отправлено: 22:28, 10-11-2007 |
Старожил Сообщения: 433
|
Профиль | Отправить PM | Цитировать Возможно здесь имеет место переполненение типа попробуйте использовать больший тип. Word или что-там было в TP 5.5. Уже не помню
|
------- Отправлено: 23:19, 10-11-2007 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
редкий гость Сообщения: 1696
|
Профиль | Сайт | Отправить PM | Цитировать |
------- Отправлено: 02:06, 11-11-2007 | #3 |
Пользователь Сообщения: 100
|
Профиль | Отправить PM | Цитировать Ещё вопрос. Насколько оправдано применение рекурсии для подсчёта количества элемнтов в двоичном дереве?
Я правильно понимаю, что в какойто момент будет создано столько же экземпляров функции Nodes, сколько в дереве элементов? Если это так, тогда есть вероятность перепонения стека, если дерево окажется достаточно большим? Если рекурсия не подходит, то как можно посчитать количество элементов? |
Отправлено: 13:11, 11-11-2007 | #4 |
редкий гость Сообщения: 1696
|
Профиль | Сайт | Отправить PM | Цитировать Gamover jr, Понимаете почти правильно. Глубина вызовыво будет соответствовать высоте дерева (которая может быть равна числу элементов, если дерево ну очень несбалансированное).
Если дерево надо обойти в ширину, то нужно применять очередь. (помещаете в качестве первого элемента тот, который будете обходить, затем в цикле, пока очередь непуста, берёт из неё элемент и кладёте в неё всех его детей). Аналогично, если нужен обход в грубину, то можно применить стек. |
|
------- Отправлено: 14:41, 11-11-2007 | #5 |
Пользователь Сообщения: 100
|
Профиль | Отправить PM | Цитировать Если дерево сбалансированное, то для подсчёта элементов предпочтительней рекурсивная функция?
Если высота полность сбалансированного двоичного дерева составляет для примера (корень + 13) = всего 11111111111111b элементов в дереве = 16383 ? В таком случае будут загружены 14 экземпляров фунции Node? Это приемлемо? Поскольку в дереве хранятся значения типа integer, в моём конкретном случае только числа от 0 до 32767 = корень + 14 = 15 экземпляров функции Nodes. Какая глубина вызова ещё приемлема, а при какой лучше от рекурсии отказаться? |
Последний раз редактировалось Gamover jr, 11-11-2007 в 16:32. Отправлено: 15:55, 11-11-2007 | #6 |
редкий гость Сообщения: 1696
|
Профиль | Сайт | Отправить PM | Цитировать Gamover jr, зависит от того где и как вы всё запускаете. Обычно стек не меньше мегабайта - тысячи вложенных вызовов в него легко влезут. А ещё сегмент стека часто умеет динамически расти. Но в любом случае, даже в досе с его ограничением на 64кб стека, такую лёгкую функцию как Nodes можно вызывать сотни раз.
|
------- Отправлено: 18:15, 11-11-2007 | #7 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
[решено] Построение дерева каталогов | kaster | AutoIt | 15 | 30-05-2021 21:04 | |
подсчёт слов в текстовом файле | bakatum | Хочу все знать | 4 | 22-01-2010 21:10 | |
Разное - Подсчёт количества узлов поддерева | 1988fenix | Программирование и базы данных | 0 | 16-12-2009 18:56 | |
UserGate - Подсчёт трафика | Deman | Сетевые технологии | 0 | 08-12-2009 11:30 | |
Подсчёт трафика | KillHunter | Программное обеспечение Linux и FreeBSD | 5 | 12-02-2009 12:25 |
|