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

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

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

> бинарные деревья
сообщение
Сообщение #1


Новичок
*

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

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


здравствуйте,помогите если можете...задача у меня простая,но я че-то недогоняю, у меня есть бинарное дерево,я читаю данные с клавиатуры и хочу вывести мое дерево на экран,скажите в чем тут моя ошибка и как ее исправить?(я знаю что у вас есть ссылки на готовую прогу на бинарные деревья,где уже имеется процедура печати,но мне не хочется плагиатить-хочется разобраться в чем я не прав,так сказать научиться)

program derevo;
uses crt;
type pstruct=^struct;
struct= record
inf:integer;
left,right:pstruct;
end;
var n,y,x,q,w,m:integer;
tree:pstruct;
z:struct;


function newd(x:integer):pstruct;
var p:pstruct;
begin
new(p);
p^.inf:=x;
p^.left:=nil;
p^.right:=nil;
newd:=p;
end;

procedure setleft(p:pstruct;x:integer);
begin
p^.left:=newd(X);
end;

procedure setright(p:pstruct;x:integer);
begin
p^.right:=newd(x);
end;



procedure viv(p:pstruct;m:integer);
begin
read(n);
while not eoln do if p=nil then begin
p:=newd(n);
gotoxy(q,w);
write(p^.inf);
read(n);
end
else if p^.inf<n then begin
setright(newd(p^.inf),n);
gotoxy(q+17,w+1);
writeln(n);
{q:=q+17;
w:=w+1;}
viv(newd(n),n);
end
else begin
setleft(newd(p^.inf),n);
gotoxy(q-17,w+1);
writeln(n);
{q:=q-17;
w:=w+1;}
viv(newd(n),n);
end;


end;

begin
clrscr;
tree:=nil;
q:=40;
w:=1;
viv(tree,m);
readln;
end.


М
При публикации программ используй теги (выделить, применить нужную опцию меню CODE)
Lapp

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


Гость






biv171, смотри чего я придумал: cool.gif

ydalenie  = 19                         20
/ \
25 19
/ \
30 22

Это по твоему условию - после удаления... А собственно удаление делается вот так:

procedure remove_less(var root: pstruct; ta: integer);

function obxod(var p: pstruct; ta: integer): boolean;
var b: boolean;
begin
if p = nil then begin
obxod := true; exit;
end;

if p^.inf < ta then begin
remove(p, p^.inf); obxod := false; exit;
end
else begin
obxod := false;
if not obxod(p^.left, ta) then exit;
if not obxod(p^.right, ta) then exit;
obxod := true;
end;
end;

begin { remove_less }
while not obxod(root, ta) do begin
{
clrscr;
writeln('one more repaint');
print(root,1,0,40,80);
readkey;
}
end;
end; { remove_less }

{ Вызывается очень просто: }
readln(q);
remove_less(tree, q);

Если раскомментируешь то, что в цикле While - то получишь пошаговый показ, что именно удаляется...

А в следующий раз, если что-то не получается, то приаттачивай программу полностью...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

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

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


Цитата(volvo @ 22.11.2008 2:27) *

biv171, смотри чего я придумал: cool.gif

ydalenie  = 19                         20
/ \
25 19
/ \
30 22

Это по твоему условию - после удаления... А собственно удаление делается вот так:

procedure remove_less(var root: pstruct; ta: integer);

function obxod(var p: pstruct; ta: integer): boolean;
var b: boolean;
begin
if p = nil then begin
obxod := true; exit;
end;

if p^.inf < ta then begin
remove(p, p^.inf); obxod := false; exit;
end
else begin
obxod := false;
if not obxod(p^.left, ta) then exit;
if not obxod(p^.right, ta) then exit;
obxod := true;
end;
end;

begin { remove_less }
while not obxod(root, ta) do begin
{
clrscr;
writeln('one more repaint');
print(root,1,0,40,80);
readkey;
}
end;
end; { remove_less }

{ Вызывается очень просто: }
readln(q);
remove_less(tree, q);

Если раскомментируешь то, что в цикле While - то получишь пошаговый показ, что именно удаляется...

А в следующий раз, если что-то не получается, то приаттачивай программу полностью...





volvo,я все-таки сделал поспешный вывод,то что разобрался,я написал процедуру remove_less,но она у меня зацикливается и ничего не меняет,укажи ошибки пожайлуста..



program derevo;
uses crt;
const dely=2;
btw=1;
type pstruct=^struct;
struct= record
inf:integer;
left,right:pstruct;
end;

var n,y,x,w,m,start_x,start_y,yzel:integer;
tree:pstruct;
z:struct;
q:byte;


procedure newd(var p:pstruct;x:integer);
begin
new(p);
p^.inf:=x;
p^.left:=nil;
p^.right:=nil;
end;



procedure zapolnenie(var tec:pstruct;n:integer);
begin
if tec=nil then newd(tec,n)
else with tec^ do begin
if inf<n then zapolnenie(right,n)
else if inf>n then zapolnenie(left,n)
end;
end;


procedure print(tec:pstruct;level:integer;l,c,r:integer);
function min(a,b:integer):integer;
begin
min:=a;
if b < a then min:=b;
end;
function center(a,b:integer):integer;
begin
center:=min(a,B)+abs( a - B) div 2;
end;
var pos_y:integer;
begin
pos_y:=start_y+ pred(level)*dely;
if tec^.left<>nil then begin
gotoxy(center(c, center(c+btw,r-btw)),pos_y+1);
write('\');
print(tec^.left,level+1,c+btw, center(c+btw,r-btw),r-btw);
end;
if tec^.right<>nil then begin
gotoxy(center(c,center(l+btw,c-btw)),pos_y+1);
write('/');
print(tec^.right,level+1,l+btw,center(l+btw,c-btw),c-btw);
end;
gotoxy(c,pos_y);
write(tec^.inf);
end;




procedure delete(var p:pstruct);
begin
if p=nil then exit;
delete(p^.right);
delete(p^.left);
dispose(p);
p:=nil;
end;


procedure ud_uz(var tec:pstruct;ta:byte);
var wasnext:pstruct;
function ud(var tec:pstruct):integer;
var wasroot:pstruct;
begin
if tec^.left=nil then begin
ud:=tec^.inf;
wasroot:=tec;
tec:=tec^.left;
dispose(wasroot);
end
else ud:=ud(tec^.left);
end;

begin
if tec<>nil then
if ta<tec^.inf then ud_uz(tec^.left,ta)
else if ta>tec^.inf then ud_uz(tec^.right,ta)
else if (tec^.left=nil)and (tec^.right=nil)
then begin
dispose(tec);
tec:=nil;
end
else if tec^.left=nil then begin
wasnext:=tec^.right;
dispose(tec);
tec:=wasnext;
end
else if tec^.right=nil then begin
wasnext:=tec^.left;
dispose(tec);
tec:=wasnext;
end
else tec^.inf:=ud(tec^.right);


end;


procedure remove_less(var tec: pstruct;ta:integer);
function obxod2(var p:pstruct;ta:integer):boolean;
var b:boolean;
begin
if p=nil then begin
obxod2:=true;
exit;
end;
if p^.inf < ta then begin
remove_less(p,p^.inf);
obxod2:=false;
exit;
end
else begin
obxod2:=false;
if not obxod2(p^.left,ta) then exit;
if not obxod2(p^.right,ta) then exit;
obxod2:=true;
end;
end;
begin
while not obxod2(tec,ta) do begin
clrscr;
writeln('one more repaint');
print(tec,1,0,40,80);
readkey;
end;
end;




procedure obxod(var tec:pstruct;yzel:integer);
var old:pstruct;
begin
if yzel<tec^.inf then obxod(tec^.left,yzel)
else if yzel>tec^.inf then obxod(tec^.right,yzel)
else begin

if tec^.right<>nil then begin
old:=tec;
tec:=tec^.right;
write(tec^.inf);
tec:=old;
end
else write('nil');
if tec^.left<>nil then begin
tec:=tec^.left;
write(' ',tec^.inf);
end
else write(' nil');
end;
end;



begin
clrscr;
tree:=nil;
start_x:=40;
start_y:=1;
while not eoln do begin
read(n);
zapolnenie(tree,n);
end;
print(tree,1,0,40,80);
readkey;
clrscr;
write('delete numbers = ');
readln(q);
remove_less(tree,q);
{while tree^.inf<q do ud_uz(tree,tree^.inf);}
{print(tree,1,0,40,80);}
{ readkey;}
{ clrscr;}
{delete(tree^.left);}
{print(tree,1,0,40,80);
readkey;}
gotoxy(1,10);
write('naiti yzel= ');
readln(yzel);
obxod(tree,yzel);
readkey;

end.




 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
biv171   бинарные деревья   19.11.2008 2:06
volvo   Неправда... У тебя нет никакого бинарного дерева (…   19.11.2008 2:58
biv171   Неправда... У тебя нет никакого бинарного дерева …   20.11.2008 1:47
biv171   упс :blink: это было бы лучше всего...   19.11.2008 4:00
volvo   Если б ты их осознал, то заполнение было бы правил…   20.11.2008 2:59
biv171   volvo а почему 3 в левом поддереве(относительно 4)…   20.11.2008 5:07
volvo   Блин... Опять не заметил... Нет, с деревом все в п…   20.11.2008 6:00
biv171   господа,не могли бы еще помочь,мне нужно удалить и…   21.11.2008 18:14
samec   господа,не могли бы еще помочь,мне нужно удалить …   21.11.2008 19:28
volvo   Обходишь дерево, находишь элемент с заданным значе…   21.11.2008 19:22
biv171   Обходишь дерево, находишь элемент с заданным знач…   21.11.2008 21:12
volvo   С использованием приведенной у меня на сайте функц…   21.11.2008 23:02
biv171   эх блин при 3 не получается....(   22.11.2008 4:34
Lapp   эх блин при 3 не получается....( Что не получается…   22.11.2008 4:52
biv171   Извините,теперь будуболее конкретно задавать вопро…   22.11.2008 5:13
Lapp   будуболее конкретно задавать вопросы Я думаю, был…   22.11.2008 5:19
volvo   biv171, смотри чего я придумал: :cool: ydalenie…   22.11.2008 6:27
biv171   [b]biv171, смотри чего я придумал: :cool: ydal…   29.11.2008 2:18
biv171   Спасибо огромное разобрался:)) :)   23.11.2008 0:10
volvo   Пожалуйста... Кусок процедуры remove_less из твоег…   29.11.2008 2:59


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

 





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