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

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

15.05.2018, 06:16. Показов 2112. Ответов 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,060
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
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru