Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 05.01.2014
Сообщений: 27

Определить число вхождений элемента Е в дерево Т

27.06.2014, 21:32. Показов 3782. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создать и продемонстрировать работу программы, которая определяет число вхождений элемента Е в дерево Т.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.06.2014, 21:32
Ответы с готовыми решениями:

Рекурсивная процедура: определить число вхождений заданного элемента в дерево
Прошу помощи в решение задания. Задание: Написать рекурсивную, которая определяет число вхождений заданного элемента в дерево.

Определить число вхождений задаваемого элемента в дерево
Определить число вхождений задаваемого элемента в дерево

Написать функцию, которая позволяет определить число вхождений элемента х в бинарное дерево
Написать функцию, которая позволяет определить число вхождений элемента х в бинарное дерево. Помогите пожалуйста

2
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
28.06.2014, 05:03
Лучший ответ Сообщение было отмечено Musikand как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
program Project1;
 
type
  {Тип ключа (тип основных данных) узла дерева.}
  TData = Integer;
  {Тип указателя на узел.}
  TPNode = ^TNode;
  {Тип узла дерева.}
  TNode = record
    Data : TData; {Ключ (основные данные) узла дерева.}
    PLeft, PRight : TPNode; {Указатели на левый и правый узел.}
  end;
 
{Рекурсивная процедура для построения дерева через пользовательский ввод.
Процедура добавляет дочерний узел к узлу aPNode.
aPNode - указатель на родительский узел. Если родительского узла нет (при
создании корня дерева), то aPNode = nil.
aLR = 1 - создать левый узел, иначе (если aLR <> 1) - создать правый узел.
aName - имя узла. Этот параметр предназначен для удобства ввода.
aName = '0' - корневой узел дерева;
aName = '0-1' - левый узел, связанный с корневым узлом.
aName = '0-2' - правый узел, связанный с корневым узлом.
И т. д.
Пример именования узлов дерева:
                   0
               /       \
           0-1           0-2
         /     \       /     \
      0-1-1  0-1-2  0-2-1  0-2-2
     /     \              /     \
 0-1-1-1  0-1-1-2     0-2-2-1  0-2-2-2       }
procedure ReadNode(var aPNode : TPNode; const aLR : Integer; aName : String);
var
  PNode : TPNode;
  Data : TData;
  Code : Integer;
  S : String;
begin
  {Формируем имя узла.}
  if aPNode = nil then {Если дерево пустое, то задаём имя корневого узла: "0".}
    aName := '0'
  else {Если дерево непустое, то имя текущего узла будет таким: "<Имя родительского узла>-<aLR>" }
  begin
    Str(aLR, S);
    aName := aName + '-' + S;
  end;
  {Предлагаем пользователю создать узел и задать его ключ.}
  Write('Узел ', aName, '. Значение: ');
  Readln(S);
  if S <> '' then {Если пользователь согласился создать узел и задал его ключ.}
  repeat
    Val(S, Data, Code); {Преобразуем строковое значение в числовое.}
    if Code = 0 then {Если пользователь ввёл значение ключа правильно.}
    begin
      {Создаём узел, записываем в него ключ и в зависимости от флага aLR
      прикрепляем его к левой или к правой ветви родительского узла aPNode.}
      New(PNode); {Выделяем память для узла.}
      PNode^.Data := Data;  {Записываем в узел значение ключа.}
      PNode^.PLeft := nil;  {Обнуляем указатель на левого потомка.}
      PNode^.PRight := nil; {Обнуляем указатель на правого потомка.}
      if aPNode = nil then
        aPNode := PNode {Узел становится корнем дерева.}
      else
      begin
        if aLR = 1 then
          aPNode^.PLeft := PNode {Узел становится левым потомком родительского узла.}
        else
          aPNode^.PRight := PNode; {Узел становится правым потомком родительского узла.}
      end;
      {Рекурсивный вызов диалога создания левого потомка.}
      ReadNode(PNode, 1, aName);
      {Рекурсивный вызов диалога создания правого потомка.}
      ReadNode(PNode, 2, aName);
    end
    else {Если пользователь ввёл данные НЕправильно.}
      Writeln('Неверный ввод. Следует ввести целое число. Повторите.');
  until Code = 0;
end;
 
{Рекурсивная процедура для освобождения памяти, занятой деревом. (Удаление дерева).}
procedure TreeFree(var aPNode : TPNode);
begin
  if aPNode <> nil then
  begin
    if aPNode^.PLeft <> nil then
      TreeFree(aPNode^.PLeft); {Рекурсивный вызов для освобождения памяти в левой ветви.}
    if aPNode^.PRight <> nil then
      TreeFree(aPNode^.PRight); {Рекурсивный вызов для освобождения памяти в правой ветви.}
    Dispose(aPNode); {Освобождение памяти, занятой для текущего узла.}
    aPNode := nil; {Обнуление указателя на текущий узел в родительском узле.}
  end;
end;
 
{Рекурсивная функция для подсчёта узлов с заданным значением ключа.}
function CountNode(const aPNode : TPNode; const aData : TData) : Integer;
var
  Cnt : Integer;
begin
  Cnt := 0; {Количество узлов, у которых значение ключа равено aData.}
  if aPNode <> nil then {Если дерево НЕпустое.}
  begin
    {Если ключ текущего узла равен искомому, то учитываем этот узел в подсчёте.}
    if aPNode^.Data = aData then
      Inc(Cnt);
    {Рекурсивный вызов для подсчёта узлов в левой и правой ветвях.}
    Cnt := Cnt + CountNode(aPNode^.PLeft, aData) + CountNode(aPNode^.PRight, aData);
  end;
  CountNode := Cnt;
end;
 
var
  PTree : TPNode;
  Data : TData;
  Cmd, Code : Integer;
  S : String;
begin
  {Начальная инициализация дерева.}
  PTree := nil;
 
  repeat
    {Меню}
    Writeln('----------');
    Writeln('Выберите действие:');
    Writeln('1: Создать дерево.');
    Writeln('2: Проверить дерево на пустоту.');
    Writeln('3: Подсчитать кол-во узлов с заданным значением ключа.');
    Writeln('4: Удалить дерево.');
    Writeln('5: Выход.');
    Write('Задайте команду: ');
    Readln(Cmd);
    case Cmd of
      1:
      begin
        Writeln('Ввод дерева.');
        Writeln('Программа будет сама предлагать вам ввод узлов. Если вы согласны');
        Writeln('создать предложенный узёл, то задайте его значение и нажмите Enter.');
        Writeln('Чтобы отказаться от создания узла оставьте пустую строку и нажмите Enter.');
        TreeFree(PTree);
        ReadNode(PTree, 0, '');
        Write('Создание дерева завершено. ');
        Readln;
      end;
      2:
      begin
        if PTree <> nil then
          Write('Дерево не пустое. ')
        else
          Write('Дерево пустое. ');
        Readln;
      end;
      3:
      begin
        repeat
          Write('Задайте искомое значение ключа: ');
          Readln(S);
          Val(S, Data, Code);
          if Code <> 0 then
            Writeln('Неверный ввод. Следует ввести целое число. Повторите.');
        until Code = 0;
        Write('Кол-во узлов с заданным значением ключа: ', CountNode(PTree, Data), '. ');
        Readln;
      end;
      4:
      begin
        TreeFree(PTree);
        Write('Дерево удалено (память освобождена). ');
        Readln;
      end;
      5:
      begin
        TreeFree(PTree);
        Writeln('Дерево удалено (память освобождена).');
      end;
      else
        Writeln('Незарегистрированная команда. Повторите ввод.');
        Readln;
    end;
  until Cmd = 5;
 
  Writeln('Работа программы завершена. Для выхода нажмите Enter.');
  Readln;
end.
Ввод дерева работает так. Программа сама будет предлагать создать узлы дерева. Если предложенный узел должен быть создан, то пользователь вводит ключ этого узла и нажимает Enter. Если предложенного узла в дереве не должно быть, то пользователь оставляет строку пустой и нажимает Enter.

Рисунок, поясняющий, как происходит диалог создания дерева:


Распечатка диалога работы с программой. Здесь, как раз, представлено создание дерева с такой же структурой, как на предыдущем рисунке:
Кликните здесь для просмотра всего текста
----------
Выберите действие:
1: Создать дерево.
2: Проверить дерево на пустоту.
3: Подсчитать кол-во узлов с заданным значением ключа.
4: Удалить дерево.
5: Выход.
Задайте команду: 1
Ввод дерева.
Программа будет сама предлагать вам ввод узлов. Если вы согласны
создать предложенный узёл, то задайте его значение и нажмите Enter.
Чтобы отказаться от создания узла оставьте пустую строку и нажмите Enter.
Узел 0. Значение: 0
Узел 0-1. Значение: 1
Узел 0-1-1. Значение: 3
Узел 0-1-1-1. Значение:
Узел 0-1-1-2. Значение:
Узел 0-1-2. Значение: 4
Узел 0-1-2-1. Значение:
Узел 0-1-2-2. Значение: 8
Узел 0-1-2-2-1. Значение:
Узел 0-1-2-2-2. Значение:
Узел 0-2. Значение: 2
Узел 0-2-1. Значение: 3
Узел 0-2-1-1. Значение:
Узел 0-2-1-2. Значение:
Узел 0-2-2. Значение: 4
Узел 0-2-2-1. Значение: 7
Узел 0-2-2-1-1. Значение:
Узел 0-2-2-1-2. Значение:
Узел 0-2-2-2. Значение:
Создание дерева завершено.
----------
Выберите действие:
1: Создать дерево.
2: Проверить дерево на пустоту.
3: Подсчитать кол-во узлов с заданным значением ключа.
4: Удалить дерево.
5: Выход.
Задайте команду: 3
Задайте искомое значение ключа: 0
Кол-во узлов с заданным значением ключа: 1.
----------
Выберите действие:
1: Создать дерево.
2: Проверить дерево на пустоту.
3: Подсчитать кол-во узлов с заданным значением ключа.
4: Удалить дерево.
5: Выход.
Задайте команду: 3
Задайте искомое значение ключа: 1
Кол-во узлов с заданным значением ключа: 1.
----------
Выберите действие:
1: Создать дерево.
2: Проверить дерево на пустоту.
3: Подсчитать кол-во узлов с заданным значением ключа.
4: Удалить дерево.
5: Выход.
Задайте команду: 3
Задайте искомое значение ключа: 2
Кол-во узлов с заданным значением ключа: 1.
----------
Выберите действие:
1: Создать дерево.
2: Проверить дерево на пустоту.
3: Подсчитать кол-во узлов с заданным значением ключа.
4: Удалить дерево.
5: Выход.
Задайте команду: 3
Задайте искомое значение ключа: 3
Кол-во узлов с заданным значением ключа: 2.
----------
Выберите действие:
1: Создать дерево.
2: Проверить дерево на пустоту.
3: Подсчитать кол-во узлов с заданным значением ключа.
4: Удалить дерево.
5: Выход.
Задайте команду: 3
Задайте искомое значение ключа: 4
Кол-во узлов с заданным значением ключа: 2.
----------
Выберите действие:
1: Создать дерево.
2: Проверить дерево на пустоту.
3: Подсчитать кол-во узлов с заданным значением ключа.
4: Удалить дерево.
5: Выход.
Задайте команду: 3
Задайте искомое значение ключа: 5
Кол-во узлов с заданным значением ключа: 0.
----------
Выберите действие:
1: Создать дерево.
2: Проверить дерево на пустоту.
3: Подсчитать кол-во узлов с заданным значением ключа.
4: Удалить дерево.
5: Выход.
Задайте команду: 3
Задайте искомое значение ключа: 6
Кол-во узлов с заданным значением ключа: 0.
----------
Выберите действие:
1: Создать дерево.
2: Проверить дерево на пустоту.
3: Подсчитать кол-во узлов с заданным значением ключа.
4: Удалить дерево.
5: Выход.
Задайте команду: 3
Задайте искомое значение ключа: 7
Кол-во узлов с заданным значением ключа: 1.
----------
Выберите действие:
1: Создать дерево.
2: Проверить дерево на пустоту.
3: Подсчитать кол-во узлов с заданным значением ключа.
4: Удалить дерево.
5: Выход.
Задайте команду: 3
Задайте искомое значение ключа: 8
Кол-во узлов с заданным значением ключа: 1.
----------
Выберите действие:
1: Создать дерево.
2: Проверить дерево на пустоту.
3: Подсчитать кол-во узлов с заданным значением ключа.
4: Удалить дерево.
5: Выход.
Задайте команду: 5
Дерево удалено (память освобождена).
Работа программы завершена. Для выхода нажмите Enter.
1
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
28.06.2014, 05:36
В Borland/Turbo Pascal строки устроены так же, как статические массивы. Поэтому, чтобы снизить загрузку стека и уменьшить затраты на копирование значения, следует строковые переменные объявить со спецификатором VAR или CONST. Это обеспечит передачу таких параметров по ссылке, а не по значению.
Всё это касается параметра aName в процедуре ReadNode(). Этот параметр следует объявить со спецификатором CONST и соответствующим образом изменить тело процедуры. Вот таким образом это можно сделать:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
{Рекурсивная процедура для построения дерева через пользовательский ввод.
Процедура добавляет дочерний узел к узлу aPNode.
aPNode - указатель на родительский узел. Если родительского узла нет (при
создании корня дерева), то aPNode = nil.
aLR = 1 - создать левый узел, иначе (если aLR <> 1) - создать правый узел.
aName - имя узла. Этот параметр предназначен для удобства ввода.
aName = '0' - корневой узел дерева;
aName = '0-1' - левый узел, связанный с корневым узлом.
aName = '0-2' - правый узел, связанный с корневым узлом.
И т. д.
Пример именования узлов дерева:
                   0
               /       \
           0-1           0-2
         /     \       /     \
      0-1-1  0-1-2  0-2-1  0-2-2
     /     \              /     \
 0-1-1-1  0-1-1-2     0-2-2-1  0-2-2-2       }
procedure ReadNode(var aPNode : TPNode; const aLR : Integer; const aName : String);
var
  PNode : TPNode;
  Data : TData;
  Code : Integer;
  SName, S : String;
begin
  {Формируем имя узла.}
  SName := aName;
  if aPNode = nil then {Если дерево пустое, то задаём имя корневого узла: "0".}
    SName := '0'
  else {Если дерево непустое, то имя текущего узла будет таким: "<Имя родительского узла>-<aLR>" }
  begin
    Str(aLR, S);
    SName := SName + '-' + S;
  end;
  {Предлагаем пользователю создать узел и задать его ключ.}
  Write('Узел ', SName, '. Значение: ');
  Readln(S);
  if S <> '' then {Если пользователь согласился создать узел и задал его ключ.}
  repeat
    Val(S, Data, Code); {Преобразуем строковое значение в числовое.}
    if Code = 0 then {Если пользователь ввёл значение ключа правильно.}
    begin
      {Создаём узел, записываем в него ключ и в зависимости от флага aLR
      прикрепляем его к левой или к правой ветви родительского узла aPNode.}
      New(PNode); {Выделяем память для узла.}
      PNode^.Data := Data;  {Записываем в узел значение ключа.}
      PNode^.PLeft := nil;  {Обнуляем указатель на левого потомка.}
      PNode^.PRight := nil; {Обнуляем указатель на правого потомка.}
      if aPNode = nil then
        aPNode := PNode {Узел становится корнем дерева.}
      else
      begin
        if aLR = 1 then
          aPNode^.PLeft := PNode {Узел становится левым потомком родительского узла.}
        else
          aPNode^.PRight := PNode; {Узел становится правым потомком родительского узла.}
      end;
      {Рекурсивный вызов диалога создания левого потомка.}
      ReadNode(PNode, 1, SName);
      {Рекурсивный вызов диалога создания правого потомка.}
      ReadNode(PNode, 2, SName);
    end
    else {Если пользователь ввёл данные НЕправильно.}
      Writeln('Неверный ввод. Следует ввести целое число. Повторите.');
  until Code = 0;
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.06.2014, 05:36
Помогаю со студенческими работами здесь

Написать функцию, которая позволяет определить число вхождений элемента х в бинарное дерево
Написать функцию, которая позволяет определить число вхождений элемента х в бинарное дерево. помогите пожалуйста

Сформировать дерево Т и определить число вхождений параметра Е в дерево Т - Блок схема
Сформировать дерево Т и определить число вхождений параметра Е в дерево Т. Вот решение задачи, народ, помогите, кто может, составить...

Описать процедуру или функцию,которая определяет число вхождений элемента Е в дерево T
Привет всем,оч. нужна помощь в этих задачках 1) Описать функцию или процедуру,которая: Определяет,яляется ли список L...

Написать рекурсивную процедуру, которая определяет число вхождений заданного элемента в дерево
Написать рекурсивную процедуру, которая определяет число вхождений заданного элемента в дерево.

Определить число вхождений элемента X в список L
Помогите реализовать программу определения числа вхождений элемента в список. Заранее спасибо.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru