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

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


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

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

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

Орловский Дмитрий
Статус: Академик
Рейтинг: 4739
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2634
∙ повысить рейтинг »
Роман Селиверстов
Статус: Академик
Рейтинг: 2413
∙ повысить рейтинг »

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

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

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



Вопрос № 183102:

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


среда программирования Turbo Pascal

Отправлен: 09.05.2011, 01:10
Вопрос задал: lexmod (Посетитель)
Всего ответов: 1
Страница вопроса »


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

Дописанная программа ниже. Одно замечание: имеющийся алгоритм процедуры Vstavka рассчитан на строго различные значения. Введённое повторяющееся значение игнорируется, не включается в дерево. Поскольку я не знаю, предусмотрено ли это постановкой задачи, то исправлять не стал.

Код:

Program derevo;
Uses Crt;

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

Type inform = Integer;
ss = ^zven o;
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;
If x<p^.inf Then Begin Vstavka (p^.left,x); End;
If x>p^.inf Then Begin Vstavka (p^.right,x); 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.

Приложение:

Ответ отправил: Сергей Бендер (Практикант)
Ответ отправлен: 09.05.2011, 17:48
Номер ответа: 267058
Тел.: 8-912-761-0437
Организация: Удмуртский ГосУнивеситет. г. Ижевск.
Абонент Skype: ostapbskype

Оценка ответа: 5
Комментарий к оценке:
все четко и предельно ясно, спасибо!

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


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

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

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

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

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

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

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



    В избранное