![]() |
Как построить дерево?
Вложений: 1
До этого никогда не работал с деревьями и четыре дня пытался сделать по найденным алгоритмам, но все они не отвечали тем требованиям, которые я к ним предъявлял. Но сегодня я нашел изображение, которое меня полностью устроило, но как построить подобное, я даже в уме не представляю.
По этому, если кто-то делал подобное, то объясните на словах , как рассчитать подобное дерево. И если Вы знаете и хотите мне помочь, то у меня ещё одна к Вам просьба - помните что я до этого с деревьями не работал и что нуждаюсь в подробном объяснении. И ещё вопрос по теме - у деревьев бывает ширина и высота и если да, то что это? |
Про рекурсию и обходы дерева тоже не знаете?
|
Цитата:
Так вот количество детей считать - могу! Получалось пирамидками детей выстраивать при помощи рекурсии, но как уже сказал ранее, меня получившееся представление не устроило и я пошел дальше. Так что можно с натяжкой сказать, что минимум манипуляций в рекурсии я умею. И вот я нашел риунок состоящий из большого количества нод и он меня устроил, но я не могу подобрать алгоритм, который бы выстраивал ноды в такой последовательности. Вот... Жду помощи. |
Ничего не понял из вопроса.
Что Вы имеете в виду, говоря "рассчитать дерево"? Что такое "алгоритмы" в данном контексте? Что они делают? Что именно представляют из себя "те требования, которые я к ним предъявлял"? Дерево оно и есть дерево. Каждый узел имеет ссылку на parent — родительский узел, и массив ссылок на children — узлы детей, для которых он в свою очередь parent. Вариантом может быть дополнительная классификация узла как "лист", то есть не имеющий детей, конечный узел. То есть можно создать класс Leaf, имеющий ссылку только на parent, и расширяющий его класс Node, имеющий так же массив ссылок на детей и методы для работы с ними (добавление/удаление, сортировка, подсчет количества, поиск по свойствам). Добавлено через 1 минуту Цитата:
|
Вправо влево это бинарное. Вверх вниз, это не слышал, какое-то двунаправленное что-ли. Ваше дерево отлично подходит, смысл в том чтобы начать рисовать его от самых листочков и потом вернуться к корню, который нарисуется в конце. Сейчас напишу алгоритм, только поем.
|
Цитата:
Цитата:
Я не понимаю какие данные нужно собрать чтобы построить отображение. Да и вообще не могу понять с какой стороны подойти к началу сбора данных. Цитата:
а ведь все равно только так, как в данном примере и можно отобразить. |
|
Еще, только сейчас понял, что я неправильно работаю с деревьями, вообще не умею.
Чтобы найти расположение чилда, нужно знать длину его чилдов ( если они есть ) и следовательно его и его чилдов. По этому я подошел неправильно и сделал деспатч изменения длины вверх по дереву:) Но это все равно мне не помогло. Да и нарисовать с конца тоже не могу, не могу даже представить как узнать координаты зная только.. Я даже не знаю, что нужно знать. А когда смотрю ещё и на картинку, особенно на увеличенную, то вообще не понимаю, почу в один раз нода без детей в центре между двумя с детьми, а в другой раз, если нет боковой с детьми, прижимается дефолтное расстояние.. Добавлено через 14 минут olexandr, как я написал в той теме, я отказался от этой библиотеки из-за устаревшего демо и невозможности посмотреть исходники, так как библиотека написана на haxe, на который я сейчас смотрю, как когда-то, да и сейчас, на php с его -> вместо точки. Неделю я не могу понять как так нарисовать, зато вдоволь с рекурсией наигрался. Добавлено через 32 минуты И если предположить, что у библиотеки по ссылке только один режим расстановки ДО, то он рано или поздно приведет к наложению узлов друг на друга. У меня в примере, хоть и может показаться что идентичная расстановка, но она не такая. У меня на картинке соседние узлы раздвигаются если у них чилды перекрывают друг друга, а у polygonal нет. |
Вложений: 1
Я потыркался, вроде и получается, но есть исключения и мне их уже лень думать сегодня. Если хоть как-то
приблизит вас к решению, буду рад. Справа кнопка рефреша. Комменты напишу и баги поправлю потом, если будет нужда. Общая идея - уходим до листиков, рисуем их, потом по усредненному Y рисуем их веточку, веточки дают среднюю Y для ветки их и так далее. Но гд-то явно прогибы есть, голова уже не варит, но задача прикольная. Код AS3:
Код AS3:
|
GBee спасибо боьшое! Сегодня некому было меня разбудить, по этому проснулся в четыре часа с квадратной головой. Сейчас уже переписал под себя и приступлю чуть попозже к "подгонке".
|
Почитай про паттерн Компоновщик (Composite). Хотя я до сих пор не въеха в суть, что ты в итоге хочешь. Никакой конкретики.
|
garymar, ТС хочет увидеть дерево визуально.
|
для обхода дерева лучше всего подходит паттерн Visitor
|
Цитата:
|
Nooob, а можете привести минимальный пример, а то очень интересно.
garymar, да я понимаю что тут композиция нужна для нод, но сложность не в создании нод, а в идентичном построении. Я уже отказался от построения в один проход. Мне кажется что этот график строился по физическим законам, так как других объяснений я найти не могу. Пример на самом деле безумно сложный. |
Цитата:
Вот пример из JSON дерева на твоей картинке: Код AS3:
Код AS3:
|
|
Wolsh спасибо за ссылку и сорри за первые комменты.
Расписано вполне доступно, а главное русским языком написано что - за один проход не получится и хватит пытаться :) Конечно есть небольшие разности, но если что, то можно и третий проход сделать.. |
OlmerDale, деревья очень хитрая штука. С ними нужно аккуратно, а то заведут в лес.
Вот, скажем, garymar не знает, что такое рекурсия и демонстрирует свои слабые знания в открытую: Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
|
Wolsh, нет, не надо папу путать. Указания на рисунки в контексте бинарных деревьев
Цитата:
Я знаю, что я зануда. Но автор статьи не удосужился, и я делаю вывод, что статья чуть менее, чем негодная. |
Цитата:
Да собственно как и все сообщения на форуме как я погляжу. |
Цитата:
Имеем данные, представленные деревом. Все дерево можно построить из, например, вот таких объектов: Код AS3:
Код AS3:
Теперь попробуем рисовать что-то по этим данным. Для начала сделаем класс для отображения одного узла: Код AS3:
|
В упор не вижу рекурсии. Я только за нее и говорил. Никаких других конструктивных предложений я не желал предложить.
|
Прошла неделя а я так и не смог сделать. Это я говорю не к тому чтобы попросить помочь, а к тому,
что очень хочется назвать того кто писал эту статью - анти-ученым. Цитата:
И так вся статья. Её писал безумный ... Добавлено через 3 минуты Если бы меня за деньги попросили написать статью о том что я знаю так чтобы никто не смог понять о чем это, то у меня бы, как у автора этой статьи не получилось. Я впервые за несколько лет встречаю то, что так убого написано и впервые столкнулся с тем, что не могу так долго сделать. |
OMG, OlmerDale.
В алгоритме 2 шага: 1. Обход дерева Т в обратном порядке 2. Обход в прямом порядке Реализация описывается не с первого шага, а со второго. Затем, в процитированном вами фрагменте, рассматривается вопрос, как реализовать первый шаг за время O(n) Статьи довольно краткие, сильно материал не разжевывают, поэтому явно подразумевается, что читатель уже имеет базовые знания по теории алгоритмов. И, например, знает, что такое оценка сложности: https://ru.wikipedia.org/wiki/Вычислительная_сложность http://cybern.ru/asimtotic-oboz.html А не начинает нападать на автора, увидев незнакомые обозначения. |
Код AS3:
А как итог, прошла ещё неделя, правда по времени что я отводил на это, ушло не больше полутора дней, а итоги все те же. То есть неделя ушла на то, чтобы понять, что алгоритм данный алгоритм просто не способен сделать желаемое и что получить желаемое можно, но не менее чем тремя рекурсиями. Надеюсь, что в начале следующей недели сделаю и покажу. Добавлено через 1 минуту Поймал себя на мысли, что свой многоэтажный дом я стал воспринимать как дерево :D |
| Часовой пояс GMT +4, время: 14:05. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.