Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 13.06.2014
Сообщений: 6

Напечатать все элементы дерева Т по уровням: сначала из корня дерева, затем (слева направо) – из вершин, дочерних по отн

15.05.2018, 06:16. Показов 2082. Ответов 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
64
65
66
67
68
69
70
71
72
73
74
75
program btree;
 
var
  i, E: integer;
 
type
  ref = ^node;
  node = record   
    key, count: integer; 
    left, right: ref;  
  end;
 
procedure Include(x: integer; var p: ref);
begin
  if p = nil then   
  begin{Добавляем вершину}   
    new(p);   
    with p^ do   
    begin
      key := x;    
      count := 1;    
      left := nil;    
      right := nil;   
    end;  
  end
  else  
  begin
    if x = p^.key then  
      {Если число есть в дереве, то увеличиваем счѐтчик}   
      p^.count := p^.count + 1   else   
    if x > p^.key then  {Добавляем в правое поддерево}   
      Include(x, p^.right)      else {Добавляем в левое поддерево}   
      Include(x, p^.left);  
  end; 
end;
 
function compare(i, E: integer; var p: ref): integer;
begin
  if (p = nil) then 
  begin
    i := -1;
    writeln('Длина пути до вершины:', i);
    halt;
  end;
  if (p^.key = E) then 
  begin
    compare := 1; 
    exit;
  end;
  if (p^.key > E) then i := compare(i, E, p^.left)
  else i := compare(i, E, p^.right); //tut
  if (i = -1) then compare := -1
  else compare := i + 1;
end;
 
var
  root: ref;   
  k: integer;
 
begin
  root := nil; 
  i := 0; 
  writeln('Поиск вершины с заданным элементом:');  
  writeln('Введите числа (0 - конец ввода)');  
  read(k);
  while (k <> 0) Do 
  begin
    read(k);     
    Include(k, root);            
  end;
  writeln('Введите число:');  
  readln(E);
  i := compare(i, E, root);   
  writeln(i);
end.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.05.2018, 06:16
Ответы с готовыми решениями:

Бинарные деревья. Напечатать все элементы дерева Т по уровням
Всем привет. Помогите написать программу или хотя бы функцию, условие следующее: Напечатать все элементы дерева Т по уровням, сначала...

Запрограммировать и отладить алгоритм обхода построенного бинарного дерева слева направо
Запрограммировать и отладить алгоритм обхода построенного бинарного дерева слева направо (в качестве примера построить и обойти дерево ,...

Напечатать сначала все положительные, а затем все отрицательные элементы массива
Сформировать массив из 100 случайных чисел. Напечатать сначала все положительные, а затем все отрицательные числа.

2
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,059
15.05.2018, 07:08
Я так понимаю, функция compare в начале времён существовала для того, чтобы находить длину пути до ветки с заданным значением… А это немного разные задачи.
Тем более, halt не должно применяться в подобной подпрограмме! Вы же можете захотеть что-то ещё от этого кода… А он вас просто выкинет не середине пути… ;–(

Ну и конструкция очень громоздкая!
Посмотрите, насколько изящнее выглядит использование case:

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
type
  ref = ^node;
  node = record   
    key, count: integer; 
    left, right: ref;  
  end;
 
procedure Include(x: integer; var p: ref);
begin
  if p = nil then   
    begin // Добавляем вершину
      new(p);   
      with p^ do   
        begin
          key := x;    
          count := 1;    
          left := nil;    
          right := nil;   
        end;  
    end
  else
    case Sign(x - p^.key) of
      -1 : Include(x, p^.left);  // x < key -- добавляем в левое поддерево
       0 : p^.count += 1;        // x = key -- увеличиваем счётчик
      +1 : Include(x, p^.right); // x > key -- добавляем в правое поддерево
    end;
end;
 
function compare(E: integer; p: ref; var Length : Integer) : Boolean;
begin
  if p = nil then // Нет такой вершины
    (Result, Length) := (False, -1)
  else
    begin
      Length += 1;
      case Sign(E - p^.key) of
        -1 : Result := compare(E, p^.left, Length);
         0 : Result := True;
        +1 : Result := compare(E, p^.right, Length);
      end;
    end;
end;
 
function PrintLevel(p : ref; Level : Integer) : Boolean;
begin
  if p = nil then
    begin
      Result := False;
      Exit;
    end;
  
  if Level = 0 then
    begin
      Result := True;
      Print(p^.key);
      Exit;
    end;
 
  var(L,R) := (PrintLevel(p^.left, Level-1),PrintLevel(p^.right, Level-1));
  Result := L or R;
end;
 
begin
  var root : ref := nil;
  writeln('Поиск вершины с заданным элементом:');
  writeln('Введите числа (0 - конец ввода)');
  var n : Integer;
  repeat
    n := ReadInteger;
    if n <> 0 then Include(n, root);
  until n = 0;
  
  WriteLn('Поиск заданного числа в дереве:');
  var Length := 0;
  if compare(ReadLnInteger('Введите число:'), root, Length) then
    WriteLn('Длина до вершины с таким элементом = ', Length)
  else
    WriteLn('Такого элемента нет!');
    
  WriteLn('Дерево по уровням:'); var Level := 0;
  while PrintLevel(root, Level) do
    begin
      Level += 1; WriteLn;
    end;
end.
Строки 59 и 60 объединять нельзя из за „лени“ компилятора. Т.е. если написать сразу «Result := PrintLevel(p^.left, Level-1) or PrintLevel(p^.right, Level-1)», тогда будет выводиться только левое поддерево.
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,882
Записей в блоге: 12
15.05.2018, 09:29
Функцию PrintLevel прекрасно можно упростить:

Pascal
1
2
3
4
5
6
7
8
9
10
function PrintLevel(p : ref; Level : Integer) : integer;
begin
  if p = nil then Result := 0
  else if Level = 0 then
  begin
    Result := 1;
    Print(p^.key);
  end 
  else result := PrintLevel(p^.left, Level-1) + PrintLevel(p^.right, Level-1); // и никакая "ленивость" компилятора не страшна
end;
, вызывать придется чуть по-другому:
Pascal
1
while PrintLevel(root, Level) > 0 do
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.05.2018, 09:29
Помогаю со студенческими работами здесь

Напечатать сначала все отрицательные, а затем все остальные элементы массива
Сформировать массив из 200 случайных чисел. Напечатать сначала все отрицательные, а затем все остальные числа.

Не получается вывести элементы дерева по уровням
//Помогите вывести элементы по уровням uses crt; type PNode=^Node; {Указатель на узел} Node=record {Тип запись в котором...

Напечатать сначала все отрицательные элементы файла, а затем положительные, используя рекурсию
Задача такая: type reals = file of real; var f : reals; Напишите рекурсивную программу, которая печатает сначала все...

Нужно напечатать все элементы с листьев дерева
Привет! Нужна помощь с деревьями. Нужно напечатать все элементы с листьев дерева. Буду очень благодарен!

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
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