Тема: Алгоритмы Как построить дерево?
Показать сообщение отдельно
Старый 16.04.2015, 20:59
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 23  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Цитата:
Сообщение от dimarik Посмотреть сообщение
На дереве рекурсия немного не подпадает под определение
Я хотел написать гневный комментарий, но мне стало лень =) Ерунда это, короче. И в особенности ерунда применительно к рисованию деревьев по данным. Использование рекурсии подходит как нельзя лучше для этой задачи.
Имеем данные, представленные деревом. Все дерево можно построить из, например, вот таких объектов:
Код AS3:
public class Node
{
    // массив детей, которые могут иметь своих детей и т.д.
    // может быть пустым
    public var children:Vector.<Node>;
 
    // данные, которые мы хотим хранить в узле дерева
    // может быть null
    public var info:String;
 
    public function Node(info:String = null)
    {
        this.children = new Vector.<Node>();
        this.info = info;
    }
}
В коде можем теперь делать вот такие штуки:
Код AS3:
var parent:Node = new Node("I'm a parent!");
var child:Node = new Node("I'm a child!");
 
parent.children.push(child);
Замечательно, теперь наша структура может стать похожей на то что было у автора поста.

Теперь попробуем рисовать что-то по этим данным. Для начала сделаем класс для отображения одного узла:
Код AS3:
public class NodeView extends Sprite
{
    private var _data:Node;
    private var _textView:TextField;
 
    public function NodeView(data:Node)
    {
        super();
 
        _data = data;
 
        this.draw();
    }
 
    // тут мы рисуем что-то, что отображает наши данные
    // так как в наши данные входит текст, то рисуем текстовое поле
    // а раз уж у нас есть еще и дети - сразу создаем отображения детей
    // "по образу и подобию" =)
    private function draw():void
    {
        _textView = new TextField();
        _textView.text = _data.info;
 
        for each (var childData:Node in _data.children)
        {
            var childView:NodeView = new NodeView(childData);
 
            // выравниваем детишек друг относительно друга
            childView.x = ...;
            childView.y = ...;
 
            // и добавляем в список отображения
            super.addChild(childView);
        }
    }
}
На выходе будем иметь экземпляр NodeView, у которого есть ширина и высота. При чем ширина и высота NodeView определяются их размеров текстового поля с информацией и размерами и положением его детей. А размеры детей определяются размерами их детей. И так далее вниз по каждой ветке дерева.
__________________
...вселенская грусть