![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
biv171 |
![]() ![]()
Сообщение
#1
|
|||
Новичок ![]() Группа: Пользователи Сообщений: 15 Пол: Мужской Репутация: ![]() ![]() ![]() |
здравствуйте,помогите если можете...задача у меня простая,но я че-то недогоняю, у меня есть бинарное дерево,я читаю данные с клавиатуры и хочу вывести мое дерево на экран,скажите в чем тут моя ошибка и как ее исправить?(я знаю что у вас есть ссылки на готовую прогу на бинарные деревья,где уже имеется процедура печати,но мне не хочется плагиатить-хочется разобраться в чем я не прав,так сказать научиться)
program derevo;
|
|||
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата у меня есть бинарное дерево,я читаю данные с клавиатуры и хочу вывести мое дерево на экран Неправда... У тебя нет никакого бинарного дерева (tree = nil, не забыл? У тебя есть структура, описывающая дерево, но сами элементы дерева отсутствуют), и ты хочешь одновременно читать данные с клавиатуры, создавать дерево и выводить его на экран?"Не пытайся объять необъятного" (С) Козьма Прутков Разбей это действие на подзадачи: сначала - заполнение дерева, а уж потом - его печать. |
biv171 |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 15 Пол: Мужской Репутация: ![]() ![]() ![]() |
упс
![]() |
biv171 |
![]()
Сообщение
#4
|
Новичок ![]() Группа: Пользователи Сообщений: 15 Пол: Мужской Репутация: ![]() ![]() ![]() |
Неправда... У тебя нет никакого бинарного дерева (tree = nil, не забыл? У тебя есть структура, описывающая дерево, но сами элементы дерева отсутствуют), и ты хочешь одновременно читать данные с клавиатуры, создавать дерево и выводить его на экран? "Не пытайся объять необъятного" (С) Козьма Прутков Разбей это действие на подзадачи: сначала - заполнение дерева, а уж потом - его печать. volvo я осознал свои ошибки по заполнению,но вот вывод на экран че то не получается,помоги пожайлуста.. Код 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 tec:pstruct; begin new(tec); tec^.inf:=x; tec^.left:=nil; tec^.right:=nil; newd:=tec; end; procedure setleft(tec:pstruct;x:integer); begin tec^.left:=newd(X); end; procedure setright(tec:pstruct;x:integer); begin tec^.right:=newd(x); end; procedure zapolnenie(tec:pstruct;z:struct); begin while not eoln do begin read(z.inf); if tec=nil then begin tree:=newd(z.inf); tec:=tree; end else if z.inf<tec^.inf then begin setleft(tec,z.inf); zapolnenie(tec^.left,z); end else begin setright(tec,z.inf); zapolnenie(tec^.right,z); end; end; end; procedure soz(tec:pstruct;f:byte); begin y:=y+1; if tec<>nil then begin if f=1 then x:=x-27; if f=2 then x:=x+15; gotoxy(x,y); if f=0 then writeln(tec^.inf); if f=1 then writeln(tec^.inf,'/'); if f=2 then writeln('\',tec^.inf); soz(tec^.left,1); soz(tec^.right,2); end; y:=y-1; end; {Основная программа} begin clrscr; tree:=nil; x:=30; y:=0; window(5,1,100,25); zapolnenie(tree,z); soz(tree,0); readkey; end.[code] Сообщение отредактировано: biv171 - 19.11.2008 22:13 |
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
Цитата я осознал свои ошибки по заполнению Если б ты их осознал, то заполнение было бы правильным, а оно у тебя неправильное. Вывод делается вот так:const, когда сделаешь правильное заполнение - получишь нормальную картинку: 1 4 8 2 7 3 1 ![]() |
biv171 |
![]()
Сообщение
#6
|
Новичок ![]() Группа: Пользователи Сообщений: 15 Пол: Мужской Репутация: ![]() ![]() ![]() |
volvo а почему 3 в левом поддереве(относительно 4) ведь она же меньше 4 она должна быть в правом???разве нет?тоже самое с 7?
|
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
Блин... Опять не заметил... Нет, с деревом все в порядке, это просто тройка "вылезла" левее "семерки", а семерка, соответственно, ушла вправо.. Значит, надо делать так, как я делал для графического вывода дерева:
procedure Print(Root: PStruct);Конечно, все усложнилось, но по крайней мере для 3-х или 4-х уровней дерева отрабатывает нормально, без наложений... Вот что показывает для того же дерева: 1 4 8 2 7 3 1 Сообщение отредактировано: volvo - 20.11.2008 2:01 |
biv171 |
![]()
Сообщение
#8
|
Новичок ![]() Группа: Пользователи Сообщений: 15 Пол: Мужской Репутация: ![]() ![]() ![]() |
господа,не могли бы еще помочь,мне нужно удалить из бинарного дерева все числа меньшие заданного:не могли бы вы дать совет как это сделать?
|
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
Обходишь дерево, находишь элемент с заданным значением, и применяешь к его левому потомку рекурсивную процедуру удаления поддерева... Ты ее реализовал, я надеюсь?
|
samec |
![]()
Сообщение
#10
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 180 Пол: Мужской Реальное имя: Юра Репутация: ![]() ![]() ![]() |
господа,не могли бы еще помочь,мне нужно удалить из бинарного дерева все числа меньшие заданного:не могли бы вы дать совет как это сделать? FAQ -> Всё о динамических структурах данных |
biv171 |
![]()
Сообщение
#11
|
Новичок ![]() Группа: Пользователи Сообщений: 15 Пол: Мужской Репутация: ![]() ![]() ![]() |
Обходишь дерево, находишь элемент с заданным значением, и применяешь к его левому потомку рекурсивную процедуру удаления поддерева... Ты ее реализовал, я надеюсь? на данном этапе,я встал вступр в случае если корень входит в удаленное значение...вот что у меня получилось.. Код uses crt; end.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; Сообщение отредактировано: biv171 - 21.11.2008 17:17 |
volvo |
![]()
Сообщение
#12
|
Гость ![]() |
С использованием приведенной у меня на сайте функции Remove(root, value), удаление всех значений, меньших, чем заданное, может выглядеть вот так:
Procedure Delete(var p: pstruct);Проверялось на 1, 4, 8, 2, 3, 7 (удалить меньшие чем 4) 1, 4, 8, 2, 3, 7, 6, 5 (удалить меньшие чем 6) и т.д. |
biv171 |
![]()
Сообщение
#13
|
Новичок ![]() Группа: Пользователи Сообщений: 15 Пол: Мужской Репутация: ![]() ![]() ![]() |
эх блин при 3 не получается....(
|
Lapp |
![]()
Сообщение
#14
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
эх блин при 3 не получается....( Что не получается? Говори конкретнее. Почему volvo тебе приводит точную и полную информацию, а ты бросаешь обрывки фраз, в которых 30% - междометия и ругательства? Это ему надо, а не тебе?.. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
biv171 |
![]()
Сообщение
#15
|
Новичок ![]() Группа: Пользователи Сообщений: 15 Пол: Мужской Репутация: ![]() ![]() ![]() |
Извините,теперь будуболее конкретно задавать вопросы (забываюсь) !!!
я просто хотел сказать,что при создании дерева при числах, например:20 25 17 18 19 16 30 22 и при задании числа ta=19(задача:нужно удалить из бинарного дерева все числа меньшие заданного)-программа удаляет и число 19 тоже,хотя не должно ,вот в этом и проблема? Сообщение отредактировано: biv171 - 22.11.2008 1:16 |
Lapp |
![]()
Сообщение
#16
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
будуболее конкретно задавать вопросы Я думаю, было бы крайне полезно, если бы ты привел текущий вариант проги. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
volvo |
![]()
Сообщение
#17
|
Гость ![]() |
biv171, смотри чего я придумал:
![]() ydalenie = 19 20 procedure remove_less(var root: pstruct; ta: integer);Если раскомментируешь то, что в цикле While - то получишь пошаговый показ, что именно удаляется... А в следующий раз, если что-то не получается, то приаттачивай программу полностью... |
biv171 |
![]()
Сообщение
#18
|
Новичок ![]() Группа: Пользователи Сообщений: 15 Пол: Мужской Репутация: ![]() ![]() ![]() |
Спасибо огромное разобрался
![]() ![]() |
biv171 |
![]()
Сообщение
#19
|
Новичок ![]() Группа: Пользователи Сообщений: 15 Пол: Мужской Репутация: ![]() ![]() ![]() |
biv171, смотри чего я придумал: ![]() ydalenie = 19 20 procedure remove_less(var root: pstruct; ta: integer);Если раскомментируешь то, что в цикле While - то получишь пошаговый показ, что именно удаляется... А в следующий раз, если что-то не получается, то приаттачивай программу полностью... volvo,я все-таки сделал поспешный вывод,то что разобрался,я написал процедуру remove_less,но она у меня зацикливается и ничего не меняет,укажи ошибки пожайлуста..
|
volvo |
![]()
Сообщение
#20
|
Гость ![]() |
Цитата укажи ошибки пожайлуста.. Пожалуйста... Кусок процедуры remove_less из твоего кода:if p^.inf < ta then begin Remove и remove_less - разные вещи, правда? Первый удаляет узел с заданным значением из дерева, второй делает нечто другое. Тебе нужен первый... Реализация есть на сайте... |
![]() ![]() |
![]() |
Текстовая версия | 20.07.2025 14:18 |