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

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

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

> Двоичное дерево, нарисовать дерево в графе
сообщение
Сообщение #1


Бывалый
***

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

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


Здравствуйте! У меня большая проблема. Не могли бы вы подсказать как можно нарисовать дерево в модуле граф. Нужно его нарисовать так, чтобы вершина этого дерева перемещалась в зависимости от того, сколько там веток. Если одна левая ветвь, то в правый угол и наоборот. Нужно, чтобы все ветви дерева были на одом уровне. К сожалению не знаю за что взяться.
Заранее благодарю!


--------------------
Ты спрашиваешь, как я переношу длинные бессонные ночи?Как свеча: как только настает утро, я гасну, тем самым, имея возможность заново загореться.

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


Гость






setare,
:no: Я пошел другим путем:
допустим, что дерево задано так:
PTNode = ^TNode;
TNode = Record;
Data: Char;
right, left: PTNode;
End;

Тогда для того, чтобы его распечатать (я пока про текстовый режим, про графический скажу потом, если такой алгоритм подойдет smile.gif ) делаем так (обычный нисходящий проход - корень, правое поддерево, левое поддерево):

procedure print_tree(root: PTNode);
const
start_x = 40;
start_y = 1;

delx = 4;
dely = 2;

procedure print_node(T: PTNode; level: integer; x_pos: integer);
var pos_x, pos_y: integer;
begin
pos_x := x_pos;
pos_y := start_y + pred(level) * dely;

gotoxy(pos_x, pos_y);
writeln(T^.data);

if T^.right <> nil then begin
gotoxy(pos_x + (delx div 2), pos_y + 1); writeln('\');
print_node(T^.right, level + 1, x_pos + delx);
end;
if T^.left <> nil then begin
gotoxy(pos_x - (delx div 2), pos_y + 1); writeln('/');
print_node(T^.left, level + 1, x_pos - delx);
end;
end;

begin
print_node(root, 1, start_x)
end;

Результат работы этой процедуры для содержимого "g l f k e h v r s a m t" имеет вид:Прикрепленное изображение

А вот для графики - можно попробовать определить
start_x := getmaxx div 2;
start_y := 10; { это значение уже надо подбирать }
delx := ... { эти тоже подбираются }
dely := ...

и заменить WriteLn на OutTextXY и Circle, главное что известны координаты и смещения узлов одно относительно другого.

Но я говорил, что будут проблемы - они есть. Масштабирование. Если будет достаточно разветвленное дерево, оно просто не поместится на экран, а при уменьшении радиуса окружности (представляющей узел) в нее просто не поместится значение узла. Так что не все так просто... Но для не очень разветвленных деревьев должно получиться неплохо... Попробуйте, если что не получится - я помогу... :yes:
 К началу страницы 
+ Ответить 

Сообщений в этой теме
setare   Двоичное дерево   22.04.2005 21:57
setare   Я знаю, что надо использовать процедуры line and c…   22.04.2005 22:01
klem4   Посмотри вот это, может поможет : http://pascal.da…   22.04.2005 22:06
setare   Двоичное дерево, потому что из главного узла выхо…   22.04.2005 22:31
klem4   Ну вот может это натолкнет тебя на мысли : вот ка…   22.04.2005 23:07
setare   Здравствуйте! У меня возникла проблема, котору…   2.05.2005 13:55
volvo   setare, а Вы когда-нибудь пробовали выводить дер…   2.05.2005 14:25
setare   Хорошо, дублировать темы я не буду! Извините…   2.05.2005 14:19
setare   Если я б знала как выводить дерево в текстовом реж…   2.05.2005 19:56
volvo   Ну, начнем с того, что ДАЖЕ если я Вам и дам проц…   2.05.2005 20:03
setare   Большое спасибо за совет! Он мне очень очень п…   2.05.2005 20:14
setare   Можно хотя бы вы проверите мой алгоритм, если уж в…   2.05.2005 20:50
volvo   setare, :no: Я пошел другим путем: допустим, что …   3.05.2005 5:13
Atos   setare,a обязательно ли рисовать имеено кружки? С …   3.05.2005 10:02
volvo   Ну так и с кружками особых проблем в этом смысле…   3.05.2005 15:27
setare   Здравствуйте! Спасибо большое за обьяснение…   4.05.2005 21:09
volvo   :no: Не только в этом случае... В любом случае, к…   4.05.2005 22:33
setare   Спасибо! Извините, что я побеспокоила вас в ва…   4.05.2005 22:45
volvo   Это функции, переменные и константы, они описаны …   4.05.2005 23:00
setare   Кстати, а вы не используете глубину и ширину дерев…   4.05.2005 22:51
setare   Спасибо! Нет я имею ввиду именно btw и dely …   4.05.2005 23:03
volvo   Btw это половина радиуса окружности (вообще-то эт…   4.05.2005 23:48
setare   Например, как?   4.05.2005 23:49
volvo   Не знаю. Надо думать. Но задачу всегда можно решит…   4.05.2005 23:52
setare   Спасибо большое и еще раз извините за беспокойство…   4.05.2005 23:56


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

 





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