Вопрос № 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 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.