- алгоритми
- візуалізація даних
Є довільне дерево, вузли-брати віддалені один від одного на динамічно задається значення (в даному випадки 20), так само як і вузли-сусіди (в даному випадки 40). У той момент, коли сама ліва гілка формується, викликається метод розстановка вузлів в який передається самий верхній-лівий і самий верхній-правий і різниця на яку збільшився проміжок між ними (в даному випадки 20).
Ось що відбувається в методі розстановка вузлів -
1. в циклі проходимо від верхній-лівої до верхньої-правої і вважаємо проміжки (в даному випадки це шість порожніх клітинок, які як говорив раніше по 20, тобто сума 120);
2. ділю суму отриману на попередньому кроці на кількість вузлів плюс один (120/3 = 40);
3. перевіряю на скільки поточний вузол (я починаю з ліва на право і по цьому поточний вузол це той у якого двоє дітей) віддалений від лівого вузла-брата (в даному випадки це 80).
4. тепер я вичитав з 80 - 40 = 40, це значення відстань на яке я зміщений поточну ноду щоб опинитися в потрібному місці.
5. якщо це значення (40) більше ніж то на яке збільшилася відстань між двома крайніми нодамі, то це значення стає меншим. Тобто розрахував що 40, але воно більше дозволеного і з цього значення змінюється на 20.
6. переміщаю ноду.
Повторюю шість попередніх кроків для наступної Ноди -
1. отримую 60
2. 60/2 = 30
3. 40
4. 30
5. 10
6.
Бачите як я усереднити? Спочатку з'ясував що зрушити потрібно на сорок, але так як на сорок зрушити я не можу (порушиться правило для нижніх дітей, вони будуть ближче ніж на сорок), я зрушую на максиму можливе, це двадцять. А потім я зрушую вже на десять.
Для прикладу, якщо б у першій оброблюваної Ноди не було дітей, то картина була б такою -
На той випадок, якщо у мене спочатку йде вузол який можна зрушити на "скільки-то" (без дітей), а після той який вже не можна зрушити на "скільки-то", то другий я знову зрушую на максимум, але при цьому виконую алгоритм з самого початку (точніше з самої останньої вдалої точки), але на час підмінюю самий верхній-правий поточним.
Я б показав код, але я не хочу щоб Ви дивилися його недоліки, а лише хочу щоб Ви зрозуміли сенс.
Ось. Але далі я зіткнувся з такою проблемою, та й можливо це тільки одна з.
Вхідні дані ті ж, але все ламається. Алгоритму, як я хотів, не вийшло, та й придумати я не можу.
Що є у нод
indent - значення на яке поточна нода віддалена від попередньої | _ | -> | _ |
leftOffset - це значення на яке я знімаю вліво. На самому початку воно нуль
rightOffset = це те значення на яке знімаю вправо. І теж по дефолту нуль.
Ось. Самі Ноди, як звичайні Ноди, ссидка на Паренте, в якому вони зберігаються в індексованих масиві. Є методи для отримання Ноди за індексом і отримання самого індексу.
Якщо є якісь ідеї я буду радий вислухати, у самого просто вселенська пустота в голові.