IncolaRO
09.08.2021 10:36

переделать программу на Паскале Разработать программу, реализующую следующий набор операций с двоичными деревьями поиска:
1. поиск вершины с заданным значением ключа с выводом счетчика появлений данного ключа.
2. добавление новой вершины в соответствии со значением ее ключа или увеличение счетчика числа появлений.
3. построчный вывод дерева в наглядном виде с обратно-симметричного обхода.
Все действия оформляются как подпрограммы.
TYPE
pNode = ^dNode;
dNode = RECORD
Inf: INTEGER;
Left,Right: pNode
END;
pStack = ^Item;
Item = RECORD
Inf: pNode;
next: pStack;
END;
VAR
Count, N, Num: INTEGER;
pRoot : pNode;

PROCEDURE Privetstvie();
BEGIN
WRITELN('Выберите действие:');
WRITELN('1-Построить дерево');
WRITELN('2-Обход в прямом направлении');
WRITELN('3-Обход в симметричном направлении');
WRITELN('4-Обход в обратно-симметричном направлении');
WRITELN('5-Итеративный Обход в симметричном направлении');
WRITELN('0-Выхода');
END;

PROCEDURE ShowOnward(VAR pCur: pNode; L: INTEGER);
BEGIN
IF pCur <> NIL
THEN
BEGIN
WRITELN('':4*L, pCur^.Inf);
ShowOnward(pCur^.Left, l+1);
ShowOnward(pCur^.Right, l+1)
END
END;

PROCEDURE ShowSymmetric(VAR pCur: pNode; L: INTEGER);
BEGIN
IF pCur <> NIL
THEN
BEGIN
ShowSymmetric(pCur^.Left, l+1);
WRITELN('':4*L, pCur^.Inf);
ShowSymmetric(pCur^.Right, l+1)
END
END;

PROCEDURE ShowBackSymmetric(VAR pCur: pNode; L: INTEGER);
BEGIN
IF pCur <> NIL
THEN
BEGIN
ShowBackSymmetric(pCur^.Right, L+1);
WRITELN('':4*L, pCur^.Inf);
ShowBackSymmetric(pCur^.Left, L+1)
END
END;

PROCEDURE Push(var s : pStack; Value : pNode);
var p : pStack;
BEGIN
NEW(p);
p^.next := s;
p^.Inf := Value;
s := p;
END;

PROCEDURE Pop(var s : pStack; var Value : pNode);
VAR
p : pStack;
BEGIN
IF s = NIL
THEN
Value := NIL
ELSE
BEGIN
Value := s^.Inf;
p := s;
s := s^.next;
DISPOSE(p);
END;
END;

PROCEDURE IterativeSymmetric(pCur: pNode);
VAR
s : pStack;
BEGIN
s := NIL;
REPEAT
WHILE pCur<> NIL
DO
BEGIN
Push(s, pCur);
pCur := pCur^.Left;
END;
IF s <> NIL
THEN
BEGIN
Pop(s, pCur);
WRITELN(pCur^.Inf);
pCur := pCur^.Right;
END;
UNTIL (s = NIL) AND (pCur = NIL);
END;

PROCEDURE ClearTree(pCur: pNode);
BEGIN
IF pCur <> NIL
THEN
BEGIN
ClearTree(pCur^.Left);
ClearTree(pCur^.Right);
DISPOSE(pCur);
Count := Count - 1;
IF Count = 0
THEN
pCur := NIL
END
END;

PROCEDURE CreateNode(var p : pNode; Data : INTEGER);
BEGIN
NEW(p);
p^.Inf := Data;
p^.Left := NIL;
p^.Right := NIL
END;

FUNCTION AddNode(var Root : pNode; Data : INTEGER) : BOOLEAN;
BEGIN
Result := TRUE;
IF Root = NIL
THEN
CreateNode(Root, Data)
ELSE
IF Root^.Inf < Data
THEN Result := AddNode(Root^.Right, Data)
ELSE
IF Root^.Inf > Data
THEN
Result := AddNode(Root^.Left, Data)
ELSE
Result := FALSE
END;

PROCEDURE AddNodes(VAR pCur: pNode; Count: INTEGER);
VAR
i, n : Integer;
BEGIN
RANDOMIZE;
FOR i := 1 TO Count
DO
REPEAT
n := Random(99);
UNTIL AddNode(pCur, n)
END;

BEGIN
pRoot := NIL;
Count := 0;
N := 6;
WHILE N <> 0
DO
BEGIN
Privetstvie();
READLN(N);
CASE N OF
0: BEGIN WRITELN('Удачи!До новых встреч.'); BREAK END;
1: BEGIN WRITELN('Число вершин дерева = '); READLN(Num); ClearTree(pRoot);
AddNodes(pRoot, Num); WRITELN('Дерево Создано') END;
2: IF pRoot <> NIL
THEN
ShowOnward(pRoot, 0)
ELSE
WRITELN('Дерево пустое');
3: IF pRoot <> NIL
THEN
ShowSymmetric(pRoot,0)
ELSE
WRITELN('Дерево пустое');
4: IF pRoot <> NIL
THEN
ShowBackSymmetric(pRoot, 0)
ELSE
WRITELN('Дерево пустое');
5: IF pRoot <> NIL
THEN
IterativeSymmetric(pRoot)
ELSE
WRITELN('Дерево пустое');
ELSE BEGIN WRITELN('Введенные данные неверны,повторите ввод'); N := 6 END
END
END
END.

Нажмите на рекламу ниже и сразу увидите ответ
Популярные вопросы:
Ответ:
Victoria200188
28.09.2020 13:49
Муравей может оказаться в точках из диапазона от -60 до 60 с ЧЕТНЫМИ значениями. Т.е. это могут быть точки -60, -58, -56, -54 ..., 0, 2, ..., 58, 60
Если муравей будет ползти не меняя направления влево или вправо по координатной прямой, то он окажется в точках -60 или 60 соответственно. Если направление будет меняться, то одни и те же единичные отрезки он будет проползать по 2 (4, 6, 8 и т.д.) раз. Если x - количество единичных отрезков, которые муравей прополз 1 раз, а y - количество отрезков, которые муравей прополз 2 раза, то можно записать x+2y=60. Т.к. 60 и 2y - четные, то и x - четное. 
0,0(0 оценок)
Ответ:
виктория2003141
17.01.2021 03:05
1. "Современный вариант"

// PascalABC.NET 3.0, сборка 1076
begin
  var n:=ReadInteger('Введите количество элементов массива: ');
  var a:=ArrRandom(n,1000,10000);
  Write('Исходный массив: ',a,#13#10);
  Write('Множество цифр из разряда сотен: ');
  a.Select(x->(x mod 1000) div 100).Sorted.Distinct.Println(',')
end.

Тестовое решение:
Введите количество элементов массива: 8
Исходный массив: [9374,4420,8856,8274,7555,2461,8302,6325]
Множество цифр из разряда сотен: 2,3,4,5,8

2. "Школьный вариант"

// PascalABC.NET 3.0, сборка 1076
var
  i,n:integer;
  sd:set of 0..9;
  a:array[1..50] of integer;
begin
  Write('Введите количество элементов массива: '); Read(n);
  Randomize;
  Write('Исходный массив: ');
  sd:=[];
  for i:=1 to n do begin
    a[i]:=Random(9001)+1000;
    Write(a[i],' ');
    Include(sd,(a[i] mod 1000) div 100)
    end;
  Writeln;
  Write('Множество цифр из разряда сотен: ');
  for i:=0 to 9 do
    if i in sd then Write(i:2);
  Writeln
end.

Тестовое решение:
Введите количество элементов массива: 8
Исходный массив: 5332 4215 7231 3399 6989 8904 7804 3517
Множество цифр из разряда сотен:  2 3 5 8 9
0,0(0 оценок)
Полный доступ
Позволит учиться лучше и быстрее. Неограниченный доступ к базе и ответам от экспертов и ai-bota Оформи подписку
logo
Начни делиться знаниями
Вход Регистрация
Что ты хочешь узнать?
Спроси ai-бота