IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> деревья, помогите решить задачу
Людмила
сообщение 16.03.2005 23:10
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 43
Пол: Женский

Репутация: -  1  +


нужно решить задачу, FAQ уже читала, пыталась сделать сама, ну просто ни чего не получается...

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


--------------------
хороших людей мало... полезных ещё меньше....
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 16.03.2005 23:41
Сообщение #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-х переменных такого типа...
smile.gif
 К началу страницы 
+ Ответить 
Людмила
сообщение 16.03.2005 23:53
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 43
Пол: Женский

Репутация: -  1  +


Цитата(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-х переменных такого типа...
smile.gif



Спасибо огромное!!!! а как формировать эти деревья? как я поняла задание дерева происходит линейно, т.е. в строку, потом из этой строки и формируется дерево?


--------------------
хороших людей мало... полезных ещё меньше....
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 18.03.2005 18:04
Сообщение #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.
 К началу страницы 
+ Ответить 
Людмила
сообщение 18.03.2005 18:40
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 43
Пол: Женский

Репутация: -  1  +


Спасибо, volvo!!!
Сейчас попробую.


--------------------
хороших людей мало... полезных ещё меньше....
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 26.07.2025 15:23
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"