Семейное древо - PullRequest
       32

Семейное древо

4 голосов
/ 19 февраля 2011

Я создаю программу семейного древа.Мой вопрос, как мне расположить узлы?Первоначально я разместил корень в центре моего экрана, и он отлично работает, если это идеальное двоичное дерево и уровни очень малы.Однако это не так часто.Это пример дерева: -

            A
        B       C
    D   E   F   I   J
K   L               N   O

Как видите, основная проблема связана с расположением узлов.Если у узла много дочерних узлов, а у соседнего узла также много дочерних, они имеют тенденцию к перекрытию (ОСНОВНАЯ ПРОБЛЕМА) Я использую абсолютное позиционирование узла с использованием Canvas в Silverlight.Вы можете не беспокоиться о части Silverlight и Canvas, если вы не являетесь разработчиком Silverlight.Мне просто нужна логика того, как расположить узлы.

Высоту дерева можно довольно легко вычислить, зная общее количество уровней дерева, но меня беспокоит ширина дерева.Как я могу вычислить ширину дерева (общую ширину холста)

Может кто-нибудь дать мне некоторые общие рекомендации относительно того, как установить ширину холста и какая логика будет работать идеально для позиционирования узлов.

ПРИМЕЧАНИЕ: - Я не прошу весь алгоритм, и это не моя домашняя работа.У меня уже есть алгоритм и база данных.Мне просто нужно руководство для позиционирующей части узла.

Заранее спасибо:)

Ответы [ 3 ]

5 голосов
/ 19 февраля 2011

Если вы реализуете функцию: width(node) для произвольного узла этого дерева, легко позиционировать каждый узел

Эта функция может быть определена рекурсивно:
- для дерева высотой 1 онадерево это ровно длина этого узла
- для дерева высотой больше 1 это сумма длин всех прямых потомков этого узла (плюс несколько пробелов между ними)

0 голосов
/ 19 февраля 2011

Я бы порекомендовал начать с самого широкого уровня дерева, если вы хотите угадать ширину холста. Вы можете рассчитать, пройдя дерево в ширину. Умножьте количество узлов на этом уровне на количество бокового пространства, в котором нуждается каждый узел, и вы получите требуемую ширину холста.

Однако это не гарантирует, что соседние узлы на самом широком уровне не будут иметь много дочерних узлов. Таким образом, чтобы выполнить интервалы без перекрытия, начните с того, что расположите листья дерева на самом глубоком уровне и обойдите дерево назад, добавив родителей выше и поместив листья в промежутки и по бокам.

0 голосов
/ 19 февраля 2011

Я бы предложил увеличить и уменьшить функциональность, чтобы загромождать GUI Real Estate.

Узел с большим количеством детей может быть сгруппирован, а специальный значок, обозначающий его, может быть увеличен до следующего уровня.будьте добры, я чувствую, что по мере роста семьи пользователь может сначала получить большую картинку и затем может увеличить любую ветку, какую пожелает.

Может помочь подсказка из пользовательского интерфейса карты Google.

...