бинарные деревья в Delphi

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Ира08
Сообщения: 4
Зарегистрирован: 03 апр 2009, 17:43

помогите пожалуйста написать рекурсивную программу, которая бы определяла кол-во вершин дерева, содержащих слова, которые являются палиндромами (исходные данные должны храниться в текстовом файле). Заранее всем благодарна :)
--------------------------------------------------------------------------------
Добавленное сообщение
--------------------------------------------------------------------------------
вот часть моей программы:

Код: Выделить всё

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
TreeView1: TTreeView;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type
P_Node = ^T_Node;
T_Node = record
info: string;
key: integer;
left, right: P_Node;
end;
procedure InsertInTree(var t: P_Node; k: Integer);

var
Form1: TForm1;
root: P_Node;

implementation

{$R *.dfm}


procedure InsertInTree(var t: P_Node; k: Integer);
begin
if t = nil
then begin
new(t);
t^.left := nil;
t^.right := nil;
t^.key := k;
t^.info:=form1.Edit2.Text;
end

else if k <= t^.key
then InsertInTree(t^.left, k)
else InsertInTree(t^.right, k);
end;

procedure ShowTree(t: P_Node; p: TTreeNode);
begin
if t <> nil then
with Form1.TreeView1 do
begin
p := Items.AddChild(p, IntToStr (t^.key) + ':'+ t^.info);
ShowTree(t^.left, p);
ShowTree(t^.right, p)
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
InsertInTree(root, strtoint(edit1.Text));
end;


procedure TForm1.Button2Click(Sender: TObject); TreeView1
var b: boolean;
begin
TreeView1.Items.Clear;
ShowTree(root, NIL);
TreeView1.FullExpand;
end;

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


function IsPalindrom(AWord: string): Boolean;
var
I: Integer;
begin
for I := 1 to Length(AWord) div 2 do
if AWord[i] <> AWord[Length(AWord) - I + 1] then
begin
IsPalindrom := False;
// Exit;
end;
IsPalindrom := True;
end;


function CalcPalindromCount(ATree: P_Node): Integer;
var
N: Integer;
begin
if ATree = nil then
begin
CalcPalindromCount := 0;
Exit;
end;
if IsPalindrom(ATree^.Info) then
N := ATree^.key
else
N := 0;
CalcPalindromCount := N + CalcPalindromCount(ATree^.Left)
+ CalcPalindromCount(ATree^.Right);
end;

procedure TForm1.Button4Click(Sender: TObject);
var x:integer;
begin

???????????????????????????????????
end;

end.
Помогите пожалуйста написать вывод количества палиндромов.и ещё как переделать ввод, чтобы считывание было из файла. Пожалуйста :)
atavin-ta
Сообщения: 585
Зарегистрирован: 30 янв 2009, 06:38

[syntax=Delphi]
function TreeCount(p:P_Node):integer;
var r:integer;
begin
r=0;
if p<>nill then
begin
r:=r+1;
r:=r+TreeCount(p.left);
r:=r+TreeCount(p.right);
end;
TreeCount:=r;
end;
[/syntax]
Функция принимает указатель на корень. Если указатель не пустой (не nil), то в дереве есть хотябы один узел - корень, иначе узлов нет. Кроме того, при непустом указателе на корень в дереве столько узлов, сколько в обоих его поддеревьях + 1 узле (оба поддерева + корень).
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Ира08
Сообщения: 4
Зарегистрирован: 03 апр 2009, 17:43

спасибо большое!!!!!!!!! я уже и сама начала понимать,что у меня корень всегда будет пустым
atavin-ta
Сообщения: 585
Зарегистрирован: 30 янв 2009, 06:38

Если корень пуст всегда, то зачем вообще нужна такая коряга? Дерево нужно как раз за тем, чтобы оно иногда было с узлами.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Ответить