Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Теория - Подсчёт узлов двоичного дерева рекурсивной функцией

Ответить
Настройки темы
Теория - Подсчёт узлов двоичного дерева рекурсивной функцией

Пользователь


Сообщения: 100
Благодарности: 0

Профиль | Отправить 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
Благодарности: 63

Профиль | Отправить PM | Цитировать


Возможно здесь имеет место переполненение типа попробуйте использовать больший тип. Word или что-там было в TP 5.5. Уже не помню

-------
photoua.narod.ru


Отправлено: 23:19, 10-11-2007 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


Код: Выделить весь код
function Nodes (inRefRoot : tRefBinBauTree) : integer;
begin
if (inRefRoot <> nil) then
    Nodes := 1 + Nodes(inrefRoot^.left) + Nodes(inrefRoot^.right)
else
    Nodes := 0;
end;

-------
http://ivank.ru

Это сообщение посчитали полезным следующие участники:

Отправлено: 02:06, 11-11-2007 | #3


Пользователь


Сообщения: 100
Благодарности: 0

Профиль | Отправить PM | Цитировать


Ещё вопрос. Насколько оправдано применение рекурсии для подсчёта количества элемнтов в двоичном дереве?
Я правильно понимаю, что в какойто момент будет создано столько же экземпляров функции Nodes, сколько в дереве элементов? Если это так, тогда есть вероятность перепонения стека, если дерево окажется достаточно большим?

Если рекурсия не подходит, то как можно посчитать количество элементов?

Отправлено: 13:11, 11-11-2007 | #4


редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


Gamover jr, Понимаете почти правильно. Глубина вызовыво будет соответствовать высоте дерева (которая может быть равна числу элементов, если дерево ну очень несбалансированное).

Если дерево надо обойти в ширину, то нужно применять очередь. (помещаете в качестве первого элемента тот, который будете обходить, затем в цикле, пока очередь непуста, берёт из неё элемент и кладёте в неё всех его детей). Аналогично, если нужен обход в грубину, то можно применить стек.

-------
http://ivank.ru

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:41, 11-11-2007 | #5


Пользователь


Сообщения: 100
Благодарности: 0

Профиль | Отправить 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
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


Gamover jr, зависит от того где и как вы всё запускаете. Обычно стек не меньше мегабайта - тысячи вложенных вызовов в него легко влезут. А ещё сегмент стека часто умеет динамически расти. Но в любом случае, даже в досе с его ограничением на 64кб стека, такую лёгкую функцию как Nodes можно вызывать сотни раз.

-------
http://ivank.ru

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:15, 11-11-2007 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Теория - Подсчёт узлов двоичного дерева рекурсивной функцией

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Построение дерева каталогов 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




 
Переход