Нотатки программістера як побудувати дерево у вигляді графа

Нотатки программістера як побудувати дерево у вигляді графа

Каскадний граф - поширена структура даних в програмуванні і часто застосовується в алгоритмах. Вміст цієї структури важко піддається дослідженню під час налагодження, в силу того, що практично завжди описується одним вузлом посилаються на своїх нащадків. Тобто щоб отримати значення деякого вузла, доводиться виконувати нетривіальний обхід дерева. І тут на допомогу може прийти візуальне уявлення такого графа. Побудова графа у вигляді компактного і легко сприймається дерева, завдання нетривіальне і має безумовно безліч рішень. У статті хотілося б поділитися власним "колесом" для вирішення цього завдання.


У статті мається на увазі, що в будь-який момент часу можна отримати інформацію про нащадків конкретного вузла дерева. Посилання на вузол-предок не обов'язкові, тому що присутні не у всіх представлених дерев.

Код в статті представлений на мові Java. Щоб код був зрозумілий читачеві, не знайомій з java, коротко опишу використовувані класи, специфічні для мови:
  • Point - описує точку з координатами x і y;
  • Dimension - визначає обсяг. Містить поля hight і width;
  • Rectangle - описує прямокутник його розмірами і координатами верхнього лівого кута;
  • TreeModel - описує дерево. Дозволяє отримувати нащадків і їх кількість для конкретного вузла.

Головною вимогою до алгоритму, була мінімальна кількість обходів дерева для обчислення координат кожного вузла.

Ідея запропонованого рішення полягає в тому, щоб розглядати в якості нащадкам не вузол окремо, а всі породжене їм дерево цілком:

Нотатки программістера як побудувати дерево у вигляді графа


Введемо поняття "грона". Гроно - це деяка структура даних, що посилається на вузол дерева і має посилання на такі ж "грона", відповідні нащадкам цього вузла.

До завдань грона входить обчислення параметрів області розташування вузла, на який вона посилається і обчислення власних габаритів.

По суті, гроно - це карта розміщення вузла і його нащадків.

Нотатки программістера як побудувати дерево у вигляді графа

Створення грон і обчислення координат верхнього лівого їх кута виконується при рекурсивном обході дерева в глибину:

Для наочного зображення ідеї, розглянемо приклад обчислення координат нащадків кореневого вузла 0. Алгоритм має на увазі, що до цього моменту координати вузлів 4-10 вже обчислені, і габарити дерев, породжуваних вузлами 1, 2 і 3 відомі (горизонтальне відстань між осередками в прикладі дорівнює 0 ):

Нотатки программістера як побудувати дерево у вигляді графа