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

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

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

> Левопрошитое дерево, проблемы
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 105
Пол: Женский
Реальное имя: Юлия

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


Основной принцип: левый - потомок, правый - брат.
Описание дерева:
 type
PTree=^TTree;
TTree=record
LL:PTree; {левый указатель - на потомка если True, на предка если False}
RL:PTree; {правый указатель - на братьев}
Key:string; {ключ}
Sign:boolean; {признак существования потомков}
end;

Если вершины нет, то создаем ее:
 if root=NIL then begin
new(root);
root^.LL:=root; {сам на себя - предков нет}
root^.RL:=NIL; {нет братьев}
root^.Key:='root';
root^.Sign:=false; {нет потомков}

Добавление... Вроде существует два варианта - либо это первый потомок, либо нет. Не выходит реализовать это условие unsure.gif
 procedure AddElem(chto:string; kuda:PTree);
begin
new(node);
if kuda^.Sign=false then begin
kuda^.LL:=node; {на сына }
kuda^.Sign:=true; {у kuda появился потомок}
node^.RL:=NIL; {у node нет братьев}
node^.LL:=kuda; {на отца}
node^.Key:=chto;
node^.Sign:=false; {у node нет потомков}
end
else begin
node:=kuda^.LL; {находим первого сына}
while node^.RL<>NIL do
begin node:=node^.RL; end; {продвигаемся по правой ветви}
node^.RL:=NIL;
node^.LL:=kuda;
node^.Key:=chto;
node^.Sign:=false;
end;
end;
.
Подскажите, плз, как с этим разобраться...

Сообщение отредактировано: volvo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Смотри, как я попробовал бы сделать:
type
PTree=^TTree;
TTree=record
LL: PTree;
RL: PTree;
Key:string;
Sign:boolean;
end;

procedure Create(var root: PTree);
begin
if root = nil then begin
new(root);
with root^ do begin
LL := nil; { <-- нет родителя - зачем присваивать себя? Работай с Nil }
RL := nil;
Key := 'root';
Sign := false; { <-- нет потомков }
end;
end;
end;

{ Здесь: kuda описывается, как Var параметр, т.к. внутри процедуры он изменяется }
procedure AddElem(chto: string; var kuda: PTree);
var p, node: PTree;
begin
new(node); { <-- Забрали память под новый элемент }
if kuda^.Sign = false then begin
{ Если у элемента, к которому надо добавить новый, нет потомков }

node^.RL := NIL; { у только что созданного элемента в любом случае нет братьев }
node^.LL := kuda; { заполняем поле предка }
node^.Key:=chto;
node^.Sign:=false; { потомков у нового элемента тоже нет }

kuda^.LL := node; { а вот у kuda появился потомок: здесь запоминаем его адрес }
kuda^.Sign:=true; { и устанавливаем признак существования потомка }
end
else begin
{
В этом случае - у элемента, которому надо добавить новый
уже есть потомки, так что добавляемых элемент будет братом
последнего из них
}

{ ищем этого брата, для чего используем новую переменную P }
p := kuda^.LL; { это первый, "старший" из братьев }
while p^.RL <> nil do
p := p^.RL;
{ теперь в P хранится адрес "младшего" брата, к нему добавим еще одного }

node^.RL:=NIL; { "младших братьев" пока нет }
node^.LL:=kuda; { устанавливаем предка }
node^.Key:=chto;
node^.Sign:=false; { потомков, естественно, тоже пока нет }

p^.RL := node; { а вот теперь изменяем RL у БЫВШЕГО "младшего" брата }
end;
end;
 К началу страницы 
+ Ответить 

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


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

 





- Текстовая версия 5.05.2024 23:19
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name