![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
Людмила |
![]()
Сообщение
#1
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 43 Пол: Женский Репутация: ![]() ![]() ![]() |
нужно решить задачу, FAQ уже читала, пыталась сделать сама, ну просто ни чего не получается...
Разработать программу, которая определяет, равны ли два бинарных дерева. -------------------- хороших людей мало... полезных ещё меньше....
|
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата(Людмила @ 16.03.05 22:10) Разработать программу, которая определяет, равны ли два бинарных дерева. Значит, так... Алгоритм сравнения рекурсивный: два дерева равны, если корень одного дерева содержит такое же значение, что и корень второго дерева, и при этом равны соответствующие поддеревья. Пустые деревья равны по определению. Код function equal(p1, p2 : pptr) : boolean; begin if (p1=nil) and (p2=nil) then equal := true else if (p1<>nil) and (p2<>nil) then equal := (p1^.info= p2^.info) and equal(p1^.llink, p2^.llink) and equal(p1^.rlink, p2^.rlink) else equal := false end; где тип ptr - указатель на узел дерева... Если поле info содержит НЕ встроенный, а определенный пользователем тип данных, может понадобиться написание дополнительной функции сравнения 2-х переменных такого типа... ![]() |
Людмила |
![]()
Сообщение
#3
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 43 Пол: Женский Репутация: ![]() ![]() ![]() |
Цитата(volvo @ 17.03.05 2:41) Значит, так... Алгоритм сравнения рекурсивный: два дерева равны, если корень одного дерева содержит такое же значение, что и корень второго дерева, и при этом равны соответствующие поддеревья. Пустые деревья равны по определению. Код function equal(p1, p2 : pptr) : boolean; begin if (p1=nil) and (p2=nil) then equal := true else if (p1<>nil) and (p2<>nil) then equal := (p1^.info= p2^.info) and equal(p1^.llink, p2^.llink) and equal(p1^.rlink, p2^.rlink) else equal := false end; где тип ptr - указатель на узел дерева... Если поле info содержит НЕ встроенный, а определенный пользователем тип данных, может понадобиться написание дополнительной функции сравнения 2-х переменных такого типа... ![]() Спасибо огромное!!!! а как формировать эти деревья? как я поняла задание дерева происходит линейно, т.е. в строку, потом из этой строки и формируется дерево? -------------------- хороших людей мало... полезных ещё меньше....
|
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата(Людмила @ 16.03.05 22:53) а как формировать эти деревья? как я поняла задание дерева происходит линейно, т.е. в строку, потом из этой строки и формируется дерево? Ну, можно и так: Код Type pptr = ^TTree; TTree = Record info: Char; llink, rlink: pptr; End; { Добавляем значение в дерево } Function AddToTree(root: pptr; nValue: Char): pptr; Begin (* If no child - create new item *) If root = nil Then Begin root := New(pptr); root^.info := nValue; root^.llink := nil; root^.rlink := nil; AddToTree := root; Exit End; If root^.info < nValue Then root^.rlink := AddToTree(root^.rlink, nValue) Else root^.llink := AddToTree(root^.llink, nValue); AddToTree := root End; Var s: String; root: pptr; i: byte; Begin s := 'This is a test'; root := nil; For i := 1 To Length(s) Do root := AddToTree(root, s[i]); { Теперь в двоичном дереве поиска, на которое указывает root, хранится строка s } End. |
Людмила |
![]()
Сообщение
#5
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 43 Пол: Женский Репутация: ![]() ![]() ![]() |
Спасибо, volvo!!!
Сейчас попробую. -------------------- хороших людей мало... полезных ещё меньше....
|
Людмила |
![]()
Сообщение
#6
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 43 Пол: Женский Репутация: ![]() ![]() ![]() |
Код root^.a := nValue; в этой строчке выдаёт ошибку "type mismatch" -------------------- хороших людей мало... полезных ещё меньше....
|
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
Проверяйте, я исправил... (кстати это должен был быть не "Type mismatch", а "Field identifier expected" )...
|
Гость |
![]()
Сообщение
#8
|
Гость ![]() |
Цитата(volvo @ 16.03.2005 23:41) Значит, так... Алгоритм сравнения рекурсивный: два дерева равны, если корень одного дерева содержит такое же значение, что и корень второго дерева, и при этом равны соответствующие поддеревья. Пустые деревья равны по определению. Мне нужна подобная функция попробыла использовать вашу но она не рабоет если ввеодишь например древья: 123654 25841 плучается equal присваевается значении истины т.е. типо деревья ровны... помогите разобрать? |
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
|
Гость |
![]()
Сообщение
#10
|
Гость ![]() |
Цитата(volvo @ 26.05.2006 12:34) Правда? У меня другая информация... Вот скриншот программы и результатов работы. Смотрим внимательно... Сори! он показывает что два дерава ровны когда в них оденаовое количство симвалов. например: 12598 fghjf получаются ровны делается неверное заключение, что два дерева равны. Эти два дерева не могут быть равны, так как в узлах записаны совершенно разные значения. |
Гость |
![]()
Сообщение
#11
|
Гость ![]() |
uses Crt;
Type
pptr = ^TTree;
TTree =
Record
info: Char;
llink, rlink: pptr;
End;
Function AddToTree(root: pptr;
nValue: Char): pptr;
Begin
If root = nil Then
Begin
root := New(pptr);
root^.info := nValue;
root^.llink := nil;
root^.rlink := nil;
AddToTree := root; Exit
End;
If root^.info < nValue Then
root^.rlink := AddToTree(root^.rlink, nValue)
Else
root^.llink := AddToTree(root^.llink, nValue);
AddToTree := root
End;
function equal(p1, p2 : pptr) : boolean;
begin
if (p1=nil) and (p2=nil) then equal := true
else if (p1<>nil) and (p2<>nil)
then equal := (p1^.info= p2^.info) and equal(p1^.llink, p2^.llink)
and equal(p1^.rlink, p2^.rlink)
else equal := false
end;
Var
s, s1: String;
root, root1: pptr;
i: byte;
Begin
ClrScr;
begin
writeln('vvedite simvoly pervogo dereva:');
readln(s);
root := nil;
For i := 1 To Length(s) Do
root := AddToTree(root, s[i]);
end;
begin
writeln('vvedite simvoly vtorogo dereva:');
read(s1);
root1 := nil;
For i := 1 To Length(s1) Do
root1 := AddToTree(root1, s[i]);
end;
if equal(root, root1)=true then writeln('dwa dereva ravny')
else writeln('dwa dereva ne ravny');
Readkey
End.
|
volvo |
![]()
Сообщение
#12
|
Гость ![]() |
For i := 1 To Length(s1) Do
root1 := AddToTree(root1, s[i]); { <--- Может, все-таки, s1[i] ??? }
|
Гость |
![]()
Сообщение
#13
|
Гость ![]() |
ух ты... работает
спасибо |
![]() ![]() |
![]() |
Текстовая версия | 12.04.2025 2:17 |