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

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

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

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Двоичное дерево, нарисовать дерево в графе
setare
сообщение 22.04.2005 17:57
Сообщение #1


Бывалый
***

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

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


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


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

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


Бывалый
***

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

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


Я знаю, что надо использовать процедуры line and circle, но как зделать так, чтобы они соединились и двигались? Главный вопрос в этом!


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

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 22.04.2005 18:06
Сообщение #3


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

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


Посмотри вот это, может поможет : http://pascal.dax.ru/?lessons&id=2&page=1

кстати, почему ДВОИЧНОЕ ? blink.gif huh.gif

Сообщение отредактировано: klem4 - 22.04.2005 18:07


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
setare
сообщение 22.04.2005 18:31
Сообщение #4


Бывалый
***

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

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


Двоичное дерево, потому что из главного узла выходят только две ветви и так до конца. Спасибо за ссылку. Понимаете, проблема как раз в том, что я никак не могу понять как использовать все это и написать процедуру. Я знаю, что надо использовать цикл для рисовании окружностей и ветвей. Но как можно соединить их? Знаю, что нужно 640 разделить на глубину +1, а 480 на ширину +1, тобы найти их место расположение. А как двигать первый узел? Каким образом прибавлять dx & dy? Половина алгоритма мне чуть-чуть ясна, а как реализовать нет. Я не хочу, чтобы вы думали, что я только жду готовую решенную задачу и все. У меня трудности с паскалем, сама я не очень в нем разбираюсь, а мне никто не обьясняет. Поэтому последняя надежла на вас!


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

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 22.04.2005 19:07
Сообщение #5


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

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


Ну вот может это натолкнет тебя на мысли :
вот картина http://forum.pascalnet.ru/index.php?act=A...ype=post&id=408
Художник Volvo :D


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
setare
сообщение 2.05.2005 9:55
Сообщение #6


Бывалый
***

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

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


Здравствуйте! У меня возникла проблема, которую я никак не могу решить без вашей помощи! Нам нужно реализовать работу с деревом и нарисовать в дальнейшем это дерево в модуле граф. Вопрос состоит в том как это сделать, а именно нарисовать дерево? К сожалению, я не знаю даже с чего начать. Не могли бы вы мне помочь? Процедуры и функции модуля я знаю, но как их можно использовать в этой программе? Также рисование дерева нужно связать с глубиной и шириной дерева. Но каким образом? Пожалуйста, напишите мне эту процедуру. Я уже 3 недели над этим парюсь и все безысходно. Помогите отстающей в паскале студентке! unsure.gif

Давайте не будем дублировать темы...

Сообщение отредактировано: volvo - 2.05.2005 10:00


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

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
setare
сообщение 2.05.2005 10:19
Сообщение #7


Бывалый
***

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

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


Хорошо, дублировать темы я не буду! Извините! :D


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

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 2.05.2005 10:25
Сообщение #8


Гость






Цитата(setare @ 2.05.05 9:55)
К сожалению, я не знаю даже с чего начать. Не могли бы вы мне помочь?


setare, а Вы когда-нибудь пробовали выводить дерево в текстовом режиме? Да, да... Не в графическом, а в текстовом, но так чтобы оно читалось сверху вниз, а не слева направо... Попробуйте. Если выводится - то просто поменять вывод текста на вывод графики. Главное - алгоритм.
 К началу страницы 
+ Ответить 
setare
сообщение 2.05.2005 15:56
Сообщение #9


Бывалый
***

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

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


Если я б знала как выводить дерево в текстовом режиме, то я бы сто процентов вывела бы его в графе и не обращалась бы к вам. Проблема вся заключается как раз в том, что я не знаю как это сделать.


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

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 2.05.2005 16:03
Сообщение #10


Гость






Цитата
Если я б знала как выводить дерево в текстовом режиме, то я бы сто процентов вывела бы его в графе и не обращалась бы к вам.

Ну, начнем с того, что ДАЖЕ если я Вам и дам процедуру вывода дерева в текстовом режиме, ее ОЧЕНЬ непросто будет заставить стабильно работать в графике. Там будет достаточно проблем.

Вы просили совет - я дал Вам совет - не пытайтесь начинать с графики. Делайте для начала в тексте.
 К началу страницы 
+ Ответить 
setare
сообщение 2.05.2005 16:14
Сообщение #11


Бывалый
***

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

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


Большое спасибо за совет! Он мне очень очень помог! sad.gif


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

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
setare
сообщение 2.05.2005 16:50
Сообщение #12


Бывалый
***

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

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


Можно хотя бы вы проверите мой алгоритм, если уж вы так не хотите мне помочь; при том всего лишь один раз я вас попросила написать процедуру?
1)Нужно поссчитать ширину дерева
2)разделить экран:высоту на глубину+1, а ширину на ширину+1 чтобы найти местоположение дерева
3)После этого найти пересечение столбцов и строк на экране, в которых будут находиться узлы дерева. Каждый узел должен находиться в своем отдельном столбце и строке.
4)Нарисовать окружности
5)поссчитать центры окружностей и провести к ним линнии
6)передвигать дерево в соответствии количества веток(если одна левая, то вправо и тд)
Проблема в том, что я не знаю как написать 3 5 6 пункты. Вот так sad.gif unsure.gif


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

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 3.05.2005 1:13
Сообщение #13


Гость






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:
 К началу страницы 
+ Ответить 
Atos
сообщение 3.05.2005 6:02
Сообщение #14


Прогрессор
****

Группа: Модераторы
Сообщений: 602
Пол: Мужской
Реальное имя: Михаил

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


setare,a обязательно ли рисовать имеено кружки? С прямоугольниками всё было бы намного проще - линии, соединяющие их, выходили бы из середины нижнего основания и входили бы соответственно в середину верхнего.

{Сам как раз сегодня ночью думал над выводом АВЛ-дерева в Дельфи. Впрочем, я ставлю задачу проще: на экран выводится определённое ограниченное количество узлов, строго в определённом месте экрана, ну и можно передвигаться по дереву, выделяя один из узлов}
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 3.05.2005 11:27
Сообщение #15


Гость






Цитата(Atos @ 3.05.05 6:02)
a обязательно ли рисовать имеено кружки? С прямоугольниками всё было бы намного проще - линии, соединяющие их, выходили бы из середины нижнего основания и входили бы соответственно в середину верхнего.


Ну так и с кружками особых проблем в этом смысле нет smile.gif
Вот что у меня получилось:


Прикрепленные файлы
Прикрепленный файл  tree_out.rar ( 1.04 килобайт ) Кол-во скачиваний: 223
 К началу страницы 
+ Ответить 
setare
сообщение 4.05.2005 17:09
Сообщение #16


Бывалый
***

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

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


Здравствуйте! Спасибо большое за обьяснение! Вот только возник вопрос. Я вместо букв ввела цифры. Все рисуется великолепно, кроме вот этого случая:
4 2 6 1 3 5 7. В этом случая она не рисует цифру 5, кот должна распологаться в левом поддереве после 6. Прграмма просто связывает 2 и 6 с 3, что мы от нее и не просили. Что тогда делать в этом случае?


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

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 4.05.2005 18:33
Сообщение #17


Гость






Цитата(setare @ 4.05.05 17:09)
Все рисуется великолепно, кроме вот этого случая:
4 2 6 1 3 5 7. В этом случая она не рисует цифру 5, кот должна распологаться в левом поддереве после 6. Прграмма просто связывает 2 и 6 с 3, что мы от нее и не просили. Что тогда делать в этом случае?

:no: Не только в этом случае... В любом случае, когда есть симматричные ветви слева и справа - будет отображаться только левая. Правая же будет ей затерта. Для того, чтобы этого не происходило, придется переписывать метод Print... Вот я тут набросал, но не проверял досконально. Можете посмотреть smile.gif

Реализация перенесена в FAQ: Динамические структуры - Деревья

procedure TTree.print;
begin
PrintTreeGraph(root)
end;


Одно НО ! Если дерево будет сильно разбалансированное или большое по размеру, то начнутся новые проблемы: при возрастании глубины расположения узла место отводимое на него и его потомков (в ширину) достаточно быстро уменьшается, и узлы начнут накладываться один на другой... Я даже не знаю, можно ли это как-то решить, кроме использования сбалансированных деревьев.
 К началу страницы 
+ Ответить 
setare
сообщение 4.05.2005 18:45
Сообщение #18


Бывалый
***

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

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


Спасибо! Извините, что я побеспокоила вас в ваш праздник!
Но есть маленький вопросик: а что означают
C+btw, Center(C+btw, R-btw), R-btw
и
pos_y := start_y + pred(level) * dely
и если будет только одна ветвь, то будет ли дерево при этом перемещаться или вправо или влево в зависимости от того кокое поддерево есть?


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

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
setare
сообщение 4.05.2005 18:51
Сообщение #19


Бывалый
***

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

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


Кстати, а вы не используете глубину и ширину дерева? Для того, чтобы узнать месторасположение первого главного узла? Тут не надо делить длину экрана на глубину и ширину на ширину дерева? И вообще можно ли таким образом все это сделать? :p2: Это просто вопрос. smile.gif А потом с помощью dx & dy перемещать дерево или вправо или влево?


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

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 4.05.2005 19:00
Сообщение #20


Гость






Цитата(setare @ 4.05.05 18:45)
Но есть маленький вопросик: а что означают
C+btw, Center(C+btw, R-btw), R-btw
и
pos_y := start_y + pred(level) * dely

Это функции, переменные и константы, они описаны выше по тексту. smile.gif
Цитата(setare @ 4.05.05 18:45)
и если будет только одна ветвь, то будет ли дерево при этом перемещаться или вправо или влево в зависимости от того кокое поддерево есть?

Нет. Ничего никуда перемещаться не будет, все будет отрисовываться точно так же, как и при двух ветвях, но одна из них будет пустой... Я просто редко пользуюсь обычными деревьями, чаще AVL, а там дерево сбалансировано, и с ним легче...
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 19.07.2025 18:08
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"