Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
4 / 4 / 0
Регистрация: 24.09.2013
Сообщений: 147
1

Составить программу вывода всех листьев бинарного дерева

04.10.2014, 17:48. Показов 4423. Ответов 2
Метки нет (Все метки)

Составить программу вывода всех листьев дерева.
У кого может есть готовая, поделитесь пожалуйста, буду очень благодарен.

Добавлено через 23 часа 2 минуты
У кого может есть готовая, поделитесь пожалуйста, буду очень благодарен.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.10.2014, 17:48
Ответы с готовыми решениями:

Функция вывода листьев бинарного дерева
Написал функцию вывода всего что есть в дереве. помогите переделать ее так чтобы она выводила...

Составить подпрограмму подсчета листьев бинарного дерева
Помогите составить подпрограмму подсчета листьев бинарного дерева.

Вывести разность значений всех листьев бинарного дерева
Дан указатель P1 на корень непустого дерева. Вывести разность значений всех листьев данного...

Вывод списка всех листьев бинарного дерева поиска
Нужно реализовать бинарное дерево поиска и вывести все его вершины, не имеющие потомков. Само...

2
4 / 4 / 0
Регистрация: 24.09.2013
Сообщений: 147
05.10.2014, 20:21  [ТС] 2
У кого может есть готовая, поделитесь пожалуйста, буду очень благодарен.
0
13073 / 5858 / 1706
Регистрация: 19.09.2009
Сообщений: 8,807
06.10.2014, 12:58 3
Лучший ответ Сообщение было отмечено kunkka1 как решение

Решение

Работа с двоичным деревом. Пояснение к диалогу ввода дерева: Вложение 415501
Delphi
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
program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils, Windows;
 
type
  {Тип ключа (тип основных данных) узла дерева.}
  TData = Integer;
  {Тип указателя на узел.}
  TPNode = ^TNode;
  {Тип узла дерева.}
  TNode = record
    Data : TData; {Ключ (основные данные) узла дерева.}
    PLeft, PRight : TPNode; {Указатели на левый и правый узел.}
  end;
 
{Рекурсивная процедура для построения дерева через пользовательский ввод.
aPNode - переменная-указатель, обозначающая создаваемый узел.
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 ReadTree(var aPNode : TPNode; const aName : String);
var
  Data : TData;
  Code : Integer;
  S : String;
begin
  {Предлагаем пользователю создать узел.}
  Write('Узел ', aName, '. Ключ: ');
  Readln(S);
  if S <> '' then {Если пользователь согласился создать узел.}
  repeat
    Val(S, Data, Code); {Преобразуем строковое значение в числовое.}
    if Code = 0 then {Если ключ задан правильно.}
    begin
      {Создаём узел.}
      New(aPNode); {Выделяем память для узла.}
      aPNode^.Data := Data;  {Записываем в узел значение ключа.}
      aPNode^.PLeft := nil;  {Обнуляем указатель на левого потомка.}
      aPNode^.PRight := nil; {Обнуляем указатель на правого потомка.}
      {Рекурсивный вызов диалога создания левого потомка.}
      ReadTree(aPNode^.PLeft, aName + '-1');
      {Рекурсивный вызов диалога создания правого потомка.}
      ReadTree(aPNode^.PRight, aName + '-2');
    end
    else {Если ключ задан НЕправильно.}
      Writeln('Неверный ввод. Следует ввести целое число. Повторите.');
  until Code = 0;
end;
 
{Рекурсивная процедура для освобождения памяти, занятой деревом. (Удаление дерева).}
procedure TreeFree(var aPNode : TPNode);
begin
  if aPNode = nil then
    Exit;
  TreeFree(aPNode^.PLeft); {Рекурсивный вызов для освобождения памяти в левой ветви.}
  TreeFree(aPNode^.PRight); {Рекурсивный вызов для освобождения памяти в правой ветви.}
  Dispose(aPNode); {Освобождение памяти, занятой для текущего узла.}
  aPNode := nil; {Обнуление указателя на текущий узел.}
end;
 
{Рекурсивная процедура для распечатки узлов дерева. С обходом слева-направо.}
procedure WritelnNode(const aPNode : TPNode; const aName : String);
begin
  if aPNode = nil then
    Exit;
  Writeln(aName, ': ', aPNode^.Data);
  WritelnNode(aPNode^.PLeft, aName + '-1');
  WritelnNode(aPNode^.PRight, aName + '-2');
end;
 
var
  PTree : TPNode;
  Cmd, Code : Integer;
  S : String;
begin
  {Переключение окна консоли на кодовую страницу CP1251 (Win-1251).
  Если после переключения русские буквы показываются неверно,
  следует открыть системное меню консольного окна - щелчком мыши в левом
  верхнем углу окна консоли и выбрать:
  Свойства - закладка "Шрифт" - выбрать шрифт: "Lucida Console".}
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
 
  {Начальная инициализация дерева.}
  PTree := nil;
 
  repeat
    {Меню}
    Writeln('----------');
    Writeln('Выберите действие:');
    Writeln('1: Создать дерево.');
    Writeln('2: Проверить дерево на пустоту.');
    Writeln('3: Распечатка узлов дерева с обходом слева-направо.');
    Writeln('4: Удалить дерево.');
    Writeln('5: Выход.');
    Write('Задайте команду: ');
    Readln(S);
    Val(S, Cmd, Code);
    if Code <> 0 then
      Cmd := -1;
    case Cmd of
      1:
      begin
        Writeln('Ввод дерева.');
        Writeln('Программа будет сама предлагать вам ввод узлов. Если вы согласны');
        Writeln('создать предложенный узел, то задайте его значение и нажмите Enter.');
        Writeln('Чтобы отказаться от создания узла оставьте пустую строку и нажмите Enter.');
        TreeFree(PTree);
        ReadTree(PTree, '0');
        Write('Ввод дерева завершён.');
      end;
      2:
      begin
        if PTree <> nil then
          Write('Дерево не пустое.')
        else
          Write('Дерево пустое.');
      end;
      3:
      begin
        WritelnNode(PTree, '0');
        Write('Конец распечатки.');
      end;
      4, 5:
      begin
        TreeFree(PTree);
        Write('Дерево удалено (память освобождена).');
      end;
      else
        Write('Незарегистрированная команда. Повторите ввод.');
    end;
    Readln;
  until Cmd = 5;
 
  Write('Работа программы завершена. Для выхода нажмите Enter.');
  Readln;
end.
Работа с двоичным деревом поиска.
Delphi
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
program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils, Windows;
 
type
  {Тип ключа (тип основных данных) узла дерева.}
  TData = Integer;
  {Тип указателя на узел.}
  TPNode = ^TNode;
  {Тип узла дерева.}
  TNode = record
    Data : TData; {Ключ (основные данные) узла дерева.}
    PLeft, PRight : TPNode; {Указатели на левый и правый узел.}
  end;
 
{Добавление узла с ключом aData в двоичное дерево поиска.}
procedure AddNode(var aPNode : TPNode; const aData : TData);
begin
  if aPNode = nil then {Вставка узла.}
  begin
    New(aPNode); {Выделяем память для узла.}
    aPNode^.Data := aData;  {Записываем в узел значение ключа.}
    aPNode^.PLeft := nil;  {Обнуляем указатель на левого потомка.}
    aPNode^.PRight := nil; {Обнуляем указатель на правого потомка.}
  end
  else if aData <= aPNode^.Data then {Поиск места вставки в левой ветви.}
    AddNode(aPNode^.PLeft, aData)
  else if aData > aPNode^.Data then  {Поиск места вставки в правой ветви.}
    AddNode(aPNode^.PRight, aData);
end;
 
{Ввод дерева.}
procedure ReadTree(var aPNode : TPNode);
var
  Data : TData;
  Code : Integer;
  S : String;
begin
  Writeln('Добавление узлов в двоичное дерево поиска.');
  Writeln('Чтобы прекратить ввод, оставьте пустую строку и нажмите Enter.');
  repeat
    Write('Задайте ключ: ');
    Readln(S);
    if S <> '' then
    repeat
      Val(S, Data, Code);
      if Code = 0 then {Если ключ задан верно.}
        AddNode(aPNode, Data) {Добавляем узел в дерево.}
      else             {Если ключ задан неверно.}
        Writeln('Неверный ввод. Следует ввести целое число. Повторите.');
    until Code = 0;
  until S = '';
  Write('Ввод дерева завершён.');
end;
 
{Рекурсивная процедура для освобождения памяти, занятой деревом. (Удаление дерева).}
procedure TreeFree(var aPNode : TPNode);
begin
  if aPNode = nil then
    Exit;
  TreeFree(aPNode^.PLeft); {Рекурсивный вызов для освобождения памяти в левой ветви.}
  TreeFree(aPNode^.PRight); {Рекурсивный вызов для освобождения памяти в правой ветви.}
  Dispose(aPNode); {Освобождение памяти, занятой для текущего узла.}
  aPNode := nil; {Обнуление указателя на текущий узел.}
end;
 
{Рекурсивная процедура для распечатки узлов дерева. С обходом слева-направо.}
procedure WritelnNode(const aPNode : TPNode; const aName : String);
begin
  if aPNode = nil then
    Exit;
  Writeln(aName, ': ', aPNode^.Data);
  WritelnNode(aPNode^.PLeft, aName + '-1');
  WritelnNode(aPNode^.PRight, aName + '-2');
end;
 
var
  PTree : TPNode;
  Cmd, Code : Integer;
  S : String;
begin
  {Переключение окна консоли на кодовую страницу CP1251 (Win-1251).
  Если после переключения русские буквы показываются неверно,
  следует открыть системное меню консольного окна - щелчком мыши в левом
  верхнем углу окна консоли и выбрать:
  Свойства - закладка "Шрифт" - выбрать шрифт: "Lucida Console".}
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
 
  {Начальная инициализация дерева.}
  PTree := nil;
 
  repeat
    {Меню}
    Writeln('----------');
    Writeln('Выберите действие:');
    Writeln('1: Создать дерево.');
    Writeln('2: Проверить дерево на пустоту.');
    Writeln('3: Распечатка узлов дерева с обходом слева-направо.');
    Writeln('4: Удалить дерево.');
    Writeln('5: Выход.');
    Write('Задайте команду: ');
    Readln(S);
    Val(S, Cmd, Code);
    if Code <> 0 then
      Cmd := -1;
    case Cmd of
      1:
      begin
        TreeFree(PTree);
        ReadTree(PTree);
      end;
      2:
      begin
        if PTree <> nil then
          Write('Дерево не пустое.')
        else
          Write('Дерево пустое.');
      end;
      3:
      begin
        WritelnNode(PTree, '0');
        Write('Конец распечатки.');
      end;
      4, 5:
      begin
        TreeFree(PTree);
        Write('Дерево удалено (память освобождена).');
      end;
      else
        Write('Незарегистрированная команда. Повторите ввод.');
    end;
    Readln;
  until Cmd = 5;
 
  Write('Работа программы завершена. Для выхода нажмите Enter.');
  Readln;
end.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.10.2014, 12:58

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

Разработать программу, которая выводит на экран элементы из всех листьев дерева
Разработать программу, которая выводит на экран элементы из всех листьев дерева Ругается на 33...

Разработать программу, которая выводит на экран элементы из всех листьев дерева
Разработать программу, которая выводит на экран элементы из всех листьев дерева #define...

Печать листьев бинарного дерева
Всем привет! Решаю такую задачу: На входе - последовательность целых чисел, оканчивающаяся 0,...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.