Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на языке Pascal


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Асмик Гаряка
Статус: Академик
Рейтинг: 8340
∙ повысить рейтинг »
Орловский Дмитрий
Статус: Советник
Рейтинг: 5680
∙ повысить рейтинг »
lamed
Статус: Академик
Рейтинг: 5534
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Pascal (Паскаль)

Номер выпуска:1201
Дата выхода:04.07.2011, 14:30
Администратор рассылки:Boriss (Академик)
Подписчиков / экспертов:164 / 173
Вопросов / ответов:1 / 1

Вопрос № 183717: Здравствуйте! У меня возникли сложности с таким вопросом: Нужно написать программу на Turbo Pascale под windows. Построить бинарное дерево поиска целочисленного типа данных. Выполнить обход дерева слева направо (левое поддерево - корен...



Вопрос № 183717:

Здравствуйте! У меня возникли сложности с таким вопросом:

Нужно написать программу на Turbo Pascale под windows.

Построить бинарное дерево поиска целочисленного типа данных. Выполнить обход дерева слева направо (левое поддерево - корень - правое поддерево). При обходе подсчитать:
- кол-во вершин имеющих хотя бы одну ненулевую связь;
- кол-во вершин имеющих две ненулевые связи;
- кол-во вершин имеющих не более одной ненулевой связи.

Хотелось бы побольше объяснений в самой программе

Заранее спасибо!

Отправлен: 26.06.2011, 12:19
Вопрос задал: лыков валерий олегович (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Сергей Бендер (Бакалавр) :
Здравствуйте, лыков валерий олегович!

Итак, сведём и оформим ответ с учётом исправлений сделанных в мини-форуме по упомянутой ссылке.

Код :
Program derevo;
Uses Crt;

{ Варианты запуска обхода с подсчетом:
1 - количество вершин, имеющих хотя бы одну ненулевую связь;
2 - количество вершин, имеющих две ненулевые связи;
3 - количество вершин, имеющих не более одной ненулевой связи.
  }
Const NeMensheOdnoj=1;
      Dve=2;
      NeBolsheOdnoj=3;

Type inform = Integer;
ss = ^zveno;
zveno = Record
key: Integer;
inf: Inform;
left, right: ss;
End;

Var t:ss;
n,nn,c,i,k: Integer;


{----формирование дерева----}

Procedure Vstavka (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 Vstavka (p^.left,x); End;
{Иначе -- в правую}
If x>=p^.inf Then Begin Vstavka (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 = NeMensheOdnoj) and ((p^.left <> Nil) or (p^.right <> Nil)))
   or
   { Второй вариант -- и left, и right не равны Nil  }
   ((v = Dve) and ((p^.left <> Nil) and (p^.right <> Nil)))
   or
   { Третий вариант -- либо left, либо right равны Nil  }
   ((v = NeBolsheOdnoj) 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 ('Vvedite koli4estvo elementov dereva: ');
Readln (n);
randomize;
For i:=1 To n Do
Begin
Writeln('Vvedite o4erednoj element');
Read (c);
Vstavka (t,c);
End;
{ Тут было Print (t,с); -- это ошибка }
Print (t,0);

Writeln('Koli4estvo vershin c >= 1 nenulevoj svjazi: ',Count(t,NeMensheOdnoj));
Writeln('Koli4estvo vershin c 2 nenulevymi svjazjami: ',Count(t,Dve));
Writeln('Koli4estvo vershin c <= 1 nenulevoj svjazi: ',Count(t,NeBolsheOdnoj));

Readkey;
End.
Добавлен размер тега код.
-----
∙ Отредактировал: Зенченко Константин Николаевич (Модератор)
∙ Дата редактирования: 01.07.2011, 11:05 (время московское)

Ответ отправил: Сергей Бендер (Бакалавр)
Ответ отправлен: 01.07.2011, 01:52
Номер ответа: 267869
Тел.: 89127610437
Организация: Удмуртский ГосУнивеситет. г. Ижевск.
Абонент Skype: ostapbskype

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267869 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное