• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Построить оптимальное дерево поиска

  • Автор темы Автор темы Lastedl
  • Дата начала Дата начала

Lastedl

Ученик
Регистрация
24 Янв 2013
Сообщения
2
Реакции
0
Баллы
0
Построить оптимальное дерево поиска

Подскажите пожалуйста реализацию алгоритма оптимального дерева.
И можно ли это переделать под оптимальное дерево поиска?
Код:
Код:
Program Tree;
Uses Crt;
{Варианты запуска обхода с подсчетом:
1 - количество вершин, имеющих хотя бы одну ненулевую связь;
2 - количество вершин, имеющих две ненулевые связи;
3 - количество вершин, имеющих не более одной ненулевой связи. }
Const AtLeastOne=1;
Two=2;
NoMoreThanOne=3;
Type inform = Integer;
ss = ^zveno;
zveno = Record
key: Integer;
inf: Inform;
left, right: ss;
End;
Var t: ss;
n,c, i: Integer;
{----формирование дерева----}
Procedure Insert (Var p: ss; x: Integer);
Begin
If p = Nil Then
Begin
New (p);
p^. inf:=x;
p^. key:=1;
p^. left:=Nil;
p^. right:=Nil;
End
else begin
If x<p^. inf Then Begin Insert (p^. left,x); End;
If x>=p^. inf Then Begin Insert (p^. right,x); End;
end;
End;
{----вывод дерева----}
Procedure Print (Var p: ss; h: Integer);
Var i: Integer;
Begin
If p <> Nil Then
Begin
Print (p^. right,h+4);
For i:=1 To h Do Write (' ');
Writeln (p^. inf);
Print (p^. left,h+4);
End;
End;
{ Рекурсивная функция, делающая подсчёт для текущего дерева }
Function Count (p: ss; v: integer): integer;
Begin
{ Нет элемента - результата ноль }
IF p = Nil Then Count:=0
Else Begin
{ Рассматриваются варианты вызова функции с соответствующими условием}
{ Первый вариант - либо left, либо right не равны Nil }
If ( (v = AtLeastOne) and ( (p^. left <> Nil) or (p^. right <> Nil)))
or
{ Второй вариант - и left, и right не равны Nil }
( (v = Two) and ( (p^. left <> Nil) and (p^. right <> Nil)))
or
{ Третий вариант - либо left, либо right равны Nil }
( (v = NoMoreThanOne) and ( (p^. left = Nil) or (p^. right = Nil)))
{ Какой-то из вариантов сработал => ставим 1
и добавляем результаты рекурсивных вызовов левой и правой ветви}
Then Count:=1 + Count (p^. left,v) + Count (p^. right,v)
{ Иначе берём 0 и добавляем рекурсивные вызовы }
else Count:=0 + Count (p^. left,v) + Count (p^. right,v)
End;
End;
{----обход дерева----}
Begin ClrScr;
Writeln ('Введите количество элементов дерева: ');
Readln (n);
randomize;
For i:=1 To n Do
Begin
Writeln ('Введите элемент дерева');
Read (c);
Insert (t,c);
End;
Print (t,0);
Writeln ('Количество вершин с >= 1 ненулевой связью: ',Count (t,AtLeastOne));
Writeln ('Количество вершин с 2-мя ненулевыми связями: ',Count (t,Two));
Writeln ('Количество вершин с <= 1 ненулевой связью: ',Count (t,NoMoreThanOne));
Readkey;
End.
 
Назад
Сверху