Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
6 / 4 / 2
Регистрация: 21.12.2019
Сообщений: 25

Дано двоичное дерево. Заполнить двумерный массив элементами дерева

11.02.2020, 17:48. Показов 2073. Ответов 6

Студворк — интернет-сервис помощи студентам
Добрый день!

Добавление элементов бинарного дерева в двумерный массив (n = кол-во элементов дерево, столбцов m = 2 ) в первую строку добавить все элементы обходя дерево, во второй строке этот же элемент сколько встречается.

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

Кликните здесь для просмотра всего текста

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
type
  PTree = ^TTree;
  TTree = record 
    el: Integer; {тип элемента дерева}
    left, right: PTree; {Указатель на левый и правый узел}
  end;
 
{-------------------------------------------------------------------}
{добавление узла в дерево}
procedure AddInTree(el: integer; var Tree: PTree);
begin
  if Tree = nil then
  begin
    New(Tree); Tree^.el := el; Tree^.left := nil; Tree^.right := nil;
  end
  else if el > tree^.el then
    AddInTree(el, Tree^.right)
  else
    AddInTree(el, Tree^.left);
end;
 
{--------------------------------------------------------------------}
{ печать дерева }
procedure PrintTree(tree: PTree; h: integer);
begin
  if tree <> nil Then
  begin
    Printtree(tree^.right, h + 3);
    Write(' ' * h);
    Writeln(tree^.el);
    Printtree(tree^.left, h + 3);
  end;
end;
 
{----------------------------------------------------------------}
 
{ освобождение памяти }
procedure ClearTree(var p: Ptree) := p := nil;
 
{----------------------------------------------------------------}
var
  Tree: PTree;
  c: integer;
 
begin
  var n := ReadInteger('Кол-во элементов:');
  writeln;
  
  for var i := 1 to n do
  begin
    write(i, ' - элемент: ');
    read(c);
    AddInTree(c, tree);
  end;
  if tree = nil then
    writeln('Дерево пустое!')
  else
  begin
    writeln('Дерево:');
    PrintTree(tree, 0);
    ClearTree(tree); {Очистка памяти}
  end;
end.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.02.2020, 17:48
Ответы с готовыми решениями:

Задача: Построить двоичное дерево, элементами которого являются числа.
Program bin_tree; { Задача. Построить двоичное дерево, элементами которого являются числа. } ...

Двоичное дерево (теория)
Преподаватель задал вопрос: &quot;Двоичное дерево. Логическое описание.&quot;... =-O Что именно подразумевает вопрос &quot;Логическое...

Двоичное дерево! Не могу дорешать...
Эта задача формирует двоичное дерево, выводит его на экран и находит максимальную глубину дерева. Оно выводит его в строчку, а мне надо по...

6
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,059
12.02.2020, 07:48
Лучший ответ Сообщение было отмечено Kolya_86 как решение

Решение

Процедуры:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function TreeCount(t : ptree) : Integer := t = nil ? 0 : 1 + TreeCount(t^.left) + TreeCount(t^.right);
 
procedure toArray(t : ptree; var i : Integer; var a : array of Integer);
begin
  if t = nil then Exit;
  a[i] := t^.el;
  i += 1;
  toArray(t^.left, i, a);
  toArray(t^.right, i, a);
end;
 
function CreateArray(t : ptree) : array [,] of Integer;
begin
  var a : array of Integer;
  var n := TreeCount(t);
  SetLength(a, n);
  var index := 0;
  toArray(t, index, a);
  SetLength(Result, n, 2);
  for var i := 0 to n-1 do
    (Result[i,0],Result[i,1]) := (a[i],a.Count(x->x=a[i]));
end;
А это между строчками с PrintTree и ClearTree:
Pascal
1
2
    var a := CreateArray(tree);
    'массив:'.Print;a.Rows.PrintLn;
1
6 / 4 / 2
Регистрация: 21.12.2019
Сообщений: 25
12.02.2020, 16:36  [ТС]
JuriiMW, подскажите пожалуйста где именно я ошибаюсь
я хочу заполнить вторую строку массива "function Search", но не знаю почему берет второй элемент из первой строки массива и заполняет 2 строку массива
Обход дерева по принципу Левый-корень-правый чтобы массив отсортировать
Pascal
function Search(tree:PTree;x:integer):integer;
begin
  if Tree=nil then 
      exit; 
  Search(Tree^.left,x);
  if x=Tree^.el then   
  begin
    inc(Result);
    write(result:3);
  end;
  Search(Tree^.right,x);     
end;
Pascal
1
2
3
4
5
for var i := 0 to n - 1 do 
  begin
  var ccc:=Search(t,a[i]);
  (Result[i, 1]) := (a[ccc]);
  end;
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
type
  PTree = ^TTree;
  TTree = record 
    el: Integer; {тип элемента дерева}
    left, right: PTree; {Указатель на левый и правый узел}
  end;
 
{-------------------------------------------------------------------}
{добавление узла в дерево}
procedure AddInTree(el: integer; var Tree: PTree);
begin
  if Tree = nil then
  begin
    New(Tree); Tree^.el := el; Tree^.left := nil; Tree^.right := nil;
  end
  else if el > tree^.el then
    AddInTree(el, Tree^.right)
  else
    AddInTree(el, Tree^.left);
end;
 
{--------------------------------------------------------------------}
{ печать дерева }
procedure PrintTree(tree: PTree; h: integer);
begin
  if tree <> nil Then
  begin
    Printtree(tree^.right, h + 3);
    Write(' ' * h);
    Writeln(tree^.el);
    Printtree(tree^.left, h + 3);
  end;
end;
 
{----------------------------------------------------------------}
 
function TreeCount(t: ptree): Integer := t = nil ? 0 : 1 + TreeCount(t^.left) + TreeCount(t^.right);
 
procedure toArray(t: ptree; var i: Integer; var a: array of Integer);
begin
  if t = nil then Exit;
  a[i] := t^.el;
  i += 1;
  toArray(t^.left, i, a);
  toArray(t^.right, i, a);
end;
 
 
function Search(tree:PTree;x:integer):integer;
 
begin
  if Tree=nil then 
      exit; 
  Search(Tree^.left,x);
  if x=Tree^.el then   
  begin
    inc(Result);
    write(result:3);
  end;
  Search(Tree^.right,x);     
end;
 
function CreateArray(t: ptree): array [,] of Integer;
begin
  var a: array of Integer;
  var n := TreeCount(t);
  var f := False;
  var count: real;
  var cc:=0;
  SetLength(a, n);
  var index := 0;
  toArray(t, index, a);
  SetLength(Result, n, 2);
  for var i := 0 to n - 1 do
    (Result[i, 0]) := (a[i]);
  for var i := 0 to n - 1 do 
  begin
  var ccc:=Search(t,a[i]);
  (Result[i, 1]) := (a[ccc]);
  end;
 
  {for var i := 0 to n - 1 do
    if Result[i, 1] = 3 then count := count + 1;
  count := count / 3;
  if count = 1 then f := true;
  writeln(f);
  //a.Count(x -> x = a[i])
  }
end;
{----------------------------------------------------------------}
 
{ освобождение памяти }
procedure ClearTree(var p: Ptree) := p := nil;
 
{----------------------------------------------------------------}
var
  Tree: PTree;
  c : integer;
 
begin
  var n := ReadInteger('Кол-во элементов:');
  writeln;
  
  for var i := 1 to n do
  begin
    write(i, ' - элемент: ');
    read(c);
    AddInTree(c, tree);
  end;
  if tree = nil then
    writeln('Дерево пустое!')
  else
  begin
    writeln('Дерево:');
    PrintTree(tree, 0);
    var a := CreateArray(tree);
    writeln;
    writeln('массив:');
    for var i := 0 to 1 do
    begin
      for var j := 0 to n - 1 do
      begin
        write(a[j, i]:3);
      end;
      writeln;
    end;
    ClearTree(tree); {Очистка памяти}
  end;
end.
[/SPOILER]
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,059
13.02.2020, 04:08
Цитата Сообщение от Kolya_86 Посмотреть сообщение
где именно я ошибаюсь
Вы откинули мой код!
Цитата Сообщение от Kolya_86 Посмотреть сообщение
берет второй элемент из первой строки массива и заполняет 2 строку
var ccc:=Search(t,a[i]); — это количество
(a[ccc]); — а здесь это индекс?
Понятно, что ошибки не будет, т.к. ссс ни когда не превысит размерность массива, но и результат можно тупо отправить в помойку!
… или я чего-то не знаю в задании потому, что вы его неправильно привели?
Или не до конца?

И зачем вам вообще функция Search?
Чем не понравилось Count?

P.S. А для сортировки массива применяется Sort или Order.
1
6 / 4 / 2
Регистрация: 21.12.2019
Сообщений: 25
13.02.2020, 16:34  [ТС]
Цитата Сообщение от JuriiMW Посмотреть сообщение
Вы откинули мой код!

Цитата Сообщение от JuriiMW Посмотреть сообщение
И зачем вам вообще функция Search?
Чем не понравилось Count?
Попробую объяснить:
1)Первую строку мы заполняем элементами дерево обходя её
2)Вторую строку должны обходя дерево записать этот же элемент сколько встречается, в :
Pascal
1
 a[i, 1]
Например:
Первый массив:
4 3 5 2 4 6

Второй массив:
2 1 1 1 1 (См. вложения)

или же
2 1 1 1 2 1

Цитата Сообщение от JuriiMW Посмотреть сообщение
И зачем вам вообще функция Search
я хотел чтобы функция Search делал:
Второй массив:
2 1 1 1 1 (См. вложения)
Чем не понравилось Count?
Всё над делать обходя дерево
Миниатюры
Дано двоичное дерево.  Заполнить двумерный массив элементами дерева  
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,059
14.02.2020, 04:14
Ну, дык, CreateArray в моей версии и возвращал пары «число — сколько раз встречается в массиве».
Собиралось это вот здесь:
Pascal
1
2
for var i := 0 to n-1 do
    (Result[i,0],Result[i,1]) := (a[i],a.Count(x->x=a[i]));
Перед этим был заполнен массив а всеми числами из дерева,
а потом посчитано сколько раз каждое число повторяется в массиве с помощью метода count.
Для этого не нужно повторно обходить дерево, ведь у нас всё есть!
1
6 / 4 / 2
Регистрация: 21.12.2019
Сообщений: 25
14.02.2020, 15:58  [ТС]
JuriiMW, Понял, Спасибо большое
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.02.2020, 15:58
Помогаю со студенческими работами здесь

Построить двоичное дерево сортировки
У меня есть одно задание, но я не представляю, что от меня требуется. Подскажите, если кто знает, как это должно выглядеть? Построить...

Как прочитать из файла цифры и погрузить в двоичное дерево
Господа помогите. У меня программа читает цифры из файла и погружает в двоичное дерево.Не понимаю почему записывается только первая цифра...

Двоичное дерево, Поиск по дереву
Здравствуйте Форумчане, переписывал прогу раза 4 и все одна и та же ошибка помогите пожалуйста! В кратце прога должна файл словаря...

Двоичное дерево кода Хаффмена
По написанному алгоритму из учебника написала код, который ищет два наименьших узла(вероятности) и складывает их, далее связывает с новым...

Двоичное дерево(реализовать логическую функцию только)
Написать программу, в котором реализована логическая функция, проверяющая, есть ли в непустом двоичном дереве, в котором допускается...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru