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


Пионер
**

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

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


Написала функцию поиска предыдущего элемента. Что-то длинноватая получилась, но работает:
 function FindPreceding(T,pp:PTree):PTree;   {pp - найденный узел}
var p:PTree;
begin
FindPreceding:=nil;
if T=nil then exit;
if T^.RL=pp then
begin
FindPreceding:=T; exit;
end;
if (T^.Sign) and (T^.LL=pp) then
begin
FindPreceding:=T; exit;
end;
if T^.Sign then
begin
p:=FindPreceding(T^.LL,pp);
FindPreceding:=p;
if p<>NIL then exit;
end;
if T^.RL<>NIL then
begin p:=FindPreceding(T^.RL,pp);
FindPreceding:=p;
if p<>NIL then exit;
end;
end;

Теперь удаление:
 procedure DeleteNode(T:PTree;ToDel:string);
var pred,posl,p:PTree;
begin
p:=FindNode(T,ToDel); {p указывает на выбранный узел}
if p<>NIL then begin {если узел найден, то...}

if p^.LL=NIL then
begin
DeleteTree(p); {найденный узел - корень дерева}
exit;
end;

pred:=FindPreceding(root,p);
if p^.Sign then {удаление поддерева без выбранного узла}
begin
posl:=p^.LL; {?как быть с левым указателем?}
DeleteTree(posl);
end;

if p^.RL=NIL then {если узел не имеет "младших" братьев}
begin
pred^.RL:=NIL;
dispose(p)
end
else
if p^.RL<>NIL then {если узел имеет "младшего" брата}
begin
if pred^.RL=p then {если предыдуший узел - "старший" брат}
begin
posl:=p^.RL;
pred^.RL:=posl;
dispose(p);
end;
if (pred^.Sign)and(pred^.LL=p) then {если предыдуший узел - отец}
begin
posl:=p^.RL;
pred^.LL:=posl;
dispose(p);
end;
end;
end;
end;



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

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


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

 





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