Консультация № 176070
15.01.2010, 22:22
43.02 руб.
0 11 1
Уважаемые эксперты. Нужна помощь с бинарным деревом. Нужно написать процедуру которая меняет местами максмальный и минимальный элемент дерева, и которая выводит в Edit все листы дерева. Добавление и просмотр уже есть в архиве. Пожалуйста помогите, если можете. Заранее спасибо.
Tree >>

Обсуждение

давно
Профессионал
304622
583
16.01.2010, 13:11
общий
Камынин Владислав Дмитриевич:
Это продолжение той задачи? Там-то всё нормально?
Неизвестный
16.01.2010, 13:17
общий
Здравствуйте, Сергей Бендер! Нет, это другая. В той нужно сделать еще удаление и поиск, а добавление и просмотр(благодаря вам) работает. Я ее отправил в задачник. Буду благодарен, если вы ее посмотрите . А это похожая только с числами, но тут задание немного другое.
давно
Профессионал
304622
583
16.01.2010, 22:08
общий
Камынин Владислав Дмитриевич:
У меня дома только Линукс (в Винде -- глюки). В понедельник к вечеру доберусь до Дельфы, посмотрю.
Неизвестный
16.01.2010, 22:11
общий
Большое спасибо, буду ждать
давно
Профессионал
304622
583
17.01.2010, 20:39
общий
Калашников О.А.:
Цитата: 273093
Я ее отправил в задачник. Буду благодарен, если вы ее посмотрите


Я тут недавно. Объясните, пожалуйста, об чём речь? Что есть "задачник"?
Неизвестный
17.01.2010, 21:42
общий
Ой, извините пожалуйста, я иммел ввиду решебник >>. Вот только задачи из решебника рассылаются только экспертам с уровнем студент и выше
давно
Профессионал
304622
583
18.01.2010, 18:26
общий
это ответ
Здравствуйте, Камынин Владислав Дмитриевич.

Итак.
По первому пункту. Тут задача немного нескладная. С одной стороны у тебя в
заготовке дерево строится упорядоченным. С другой стороны, если мы меняем
местами макс. и мин. элементы, то оно заведомо перестаёт быть таковым. Я
прикинул и решил всё-таки воспользоваться упорядоченностью дерева -- проще
алгоритм. Т.е. циклом while идём по левым веткам до nil'а -- получаем
минимум, идём по правым веткам -- получаем максимум. Но! В этом случае
команда получается "одноразовой". Т.е. если после престановки ещё добавить
элементов, то новая перестановка минимума и максимума будет некорректной.

Если надо, можно переписать, сделать перестановку более общей.


По второму пункту. Это можно сделать очень просто. То же самое что и
просто вывод, только с дополнительным условием
(t1.ls=nil) and (t1.rs=nil)


Код в приложении. (Комментариев не писал -- думаю, я тут уже всё
объяснил.)

Проверка второго пункта.
Вводим по очереди:
0 -3 5 -4 -2 -1 3 2

Получается дерево:
https://rfpro.ru/upload/1378

Вывод листьев:
-4,-1,2,4


Приложение:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls;

type
btree=^telem;
telem=record
d:integer;
rs,ls:btree;
end;
TForm1 = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
procedure N2Click(Sender: TObject);
procedure Dobavlenie(n:integer;t1:btree);
procedure N3Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure PrtLKP(t1:btree);
procedure N4Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure LeavesLKP(t1:btree);
procedure N6Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
t:btree;
tmp:real=0;
number:integer=0;

implementation

{$R *.dfm}

procedure TForm1.N2Click(Sender: TObject);
begin
close;
end;

procedure TForm1.Dobavlenie;
var p:btree;
begin
if n<t1^.d then
if t1^.ls=nil then
begin
new(p);
p^.d:=n;
p^.ls:=nil;
p^.rs:=nil;
t1^.ls:=p;
end
else Dobavlenie(n,t1^.ls)
else
if t1^.rs=nil then
begin
new(p);
p^.d:=n;
p^.ls:=nil;
p^.rs:=nil;
t1^.rs:=p;
end
else Dobavlenie(n,t1^.rs)
end;

procedure TForm1.N3Click(Sender: TObject);
var h:integer;
begin
if Edit1.Text='' then
begin
MessageDlg('Введите число для добавления!', mtError, [mbOk],0);
exit;
end;
h:=strtoint(Edit1.Text);
if t=nil then
begin
new(t);
t^.d:=h;
t^.rs:=nil;
t^.ls:=nil;
end
else Dobavlenie(h,t);
Edit1.Text:='';
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
t:=nil;
end;

procedure TForm1.PrtLKP(t1:btree);
begin
if t1=nil then Edit2.Text:=Edit2.Text
else begin
PrtLKP(t1^.ls);
Edit2.Text:=Edit2.Text+inttostr(t1^.d)+',';
PrtLKP(t1^.rs);
end
end;

procedure TForm1.N4Click(Sender: TObject);
begin
Edit2.Text:='';
PrtLKP(t);
end;

{Менять местами минимум и максимум}
procedure TForm1.N5Click(Sender: TObject);
var MinEl,MaxEl:btree;
i:integer;
begin
MinEl:=t;
while MinEl^.ls<>nil do MinEl:=MinEl^.ls;
MaxEl:=t;
while MaxEl^.rs<>nil do MaxEl:=MaxEl^.rs;
i:=MinEl^.d;
MinEl^.d:=MaxEl^.d;
MaxEl^.d:=i;
end;

{Выводить листья}
procedure TForm1.LeavesLKP(t1:btree);
begin
if t1<>nil then begin
LeavesLKP(t1^.ls);
if (t1.ls=nil) and (t1.rs=nil) then
Edit4.Text:=Edit4.Text+inttostr(t1^.d)+',';
LeavesLKP(t1^.rs)
end
end;

procedure TForm1.N6Click(Sender: TObject);
begin
Edit4.Text:='';
LeavesLKP(t);
end;

end.
давно
Профессионал
304622
583
18.01.2010, 18:31
общий
Камынин Владислав Дмитриевич:
Цитата: 273093
Я ее отправил в задачник. Буду благодарен, если вы ее посмотрите

Цитата: 273093
Ой, извините пожалуйста, я иммел ввиду решебник >>. Вот только задачи из решебника рассылаются только экспертам с уровнем студент и выше


В следующий раз посмотрю. Потом закину в форум или как-нибудь.
давно
Мастер-Эксперт
425
4118
21.01.2010, 14:40
общий
Сергей Бендер:
Цитата: Сергей Бендер
У меня дома только Линукс...

Тогда, специально для Вашего случая, есть Lazarus, который по внешнему виду и принципам работы черезвычайно похож на Delphi 7. Программирование там тоже идёт на Паскале.
Если Ваша ОС может обновлятся из репозитария (например ALT Linux или Ubuntu), то в Synaptic'е найдите контекстным поиском слово Lazarus и установите его. Если репозитарий недоступен, то можно скачать отсюда. Только выберите Ваш тип установочного пакета.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Профессионал
304622
583
22.01.2010, 13:57
общий
sir Henry:
Что ни день, то открытия! Мне казалось, что Lazarus (я про него знал) только под Windows. Т.е. я думал, что как с Kylix не заладилось, то под Линукс уже ничего не пытались перенести. Спасибо.

давно
Мастер-Эксперт
425
4118
22.01.2010, 17:35
общий
Сергей Бендер:
Наоборот, проект Lazarus и возник как раз из-за того, что с Kylix не заладилось. Предполагался кроссплатформенный набор визуальных компонентов, чтобы не переписывать код на разных ОС. В принципе сейчас эта цель достигнута, если только программа не будет использовать каких-либо специфичных для ОС функций.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Форма ответа