1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
здравствуйте,помогите если можете...задача у меня простая,но я че-то недогоняю, у меня есть бинарное дерево,я читаю данные с клавиатуры и хочу вывести мое дерево на экран,скажите в чем тут моя ошибка и как ее исправить?(я знаю что у вас есть ссылки на готовую прогу на бинарные деревья,где уже имеется процедура печати,но мне не хочется плагиатить-хочется разобраться в чем я не прав,так сказать научиться)
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
Обходишь дерево, находишь элемент с заданным значением, и применяешь к его левому потомку рекурсивную процедуру удаления поддерева... Ты ее реализовал, я надеюсь?
Обходишь дерево, находишь элемент с заданным значением, и применяешь к его левому потомку рекурсивную процедуру удаления поддерева... Ты ее реализовал, я надеюсь?
на данном этапе,я встал вступр в случае если корень входит в удаленное значение...вот что у меня получилось..
Код
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: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 tec:pstruct;ta:byte); begin if tec<>nil then begin if (tec^.right<>nil) and (ta>tec^.inf) then delete(tec^.right,ta); if (tec^.left<>nil) and (ta>tec^.inf) then delete(tec^.left,ta) else delete(tec^.left,ta); dispose(tec); tec:=nil; end;
end;
procedure obxod(var tec:pstruct;ta:byte); var old:pstruct; begin if ta<tec^.inf then obxod(tec^.left,ta) else if ta>tec^.inf then delete(tec,ta) else obxod(tec^.left,ta);
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('ydalenie = '); readln(q); obxod(tree,q); print(tree,1,0,40,80); readkey;