Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   как красиво дерево обойти (http://www.flasher.ru/forum/showthread.php?t=88954)

dacino 04.12.2006 21:21

как красиво дерево обойти
 
есть дерево с неизвестным уровнем вложенности(знаем его корень), подскажите оптимальный алгоритм для решения такой задачи -
1 - нужно элемент расположеныый на самом верхнем уровне
2 - от верхнего элемента дойти до корня перебрав все элементы данного дерева
возможно ли обойтись без 2-х рекурсий

откомпилите исходник(добавив предварительно в либаре баттон) в режиме отладки и немного пожмакав эту самую кнопочку, вы увидете то самое дерево (его корень ...c_mc.inp), которое надо обойти, и не ругайте меня за выделение функций в класс Draw(понимаю, что можно было обойтись и #include) Другие замечания приветствуются
у меня перебор от корня к верхнему элементу - работает криво

etc 05.12.2006 00:59

По-моему, достаточно вообще одной рекурсии.

dacino 05.12.2006 01:34

__etc - поясни, как обойтись одной, тут уже красота кода, черт с ней, мне пока что б заработало, писал под две рекурсии вот первая - должна искать верхний "уровень"
Код:

function heard(l_mc:MovieClip):MovieClip{
                var d:Number = l_mc.getNextHighestDepth();
                var el = null, nel = null;
                for(var i = 0; i<d; i++){
                        el = l_mc.getInstanceAtDepth(i);
                        if(el instanceof MovieClip){
                                var ed:Number = el.getNextHighestDepth();
                                for(var j = 0; j<ed; j++){
                                        nel = el.getInstanceAtDepth(j);
                                        if(nel instanceof MovieClip){
                                                heard(nel);                                               
                                        }                                       
                                }
                                return el;//? где это должно быть чтоб результат был правильный
                        }
                }
        }

в чужом коде всегда разбираться западло, расказываю как могу:
есть главный мув на нем еще два - один(на нем создаются мувы с TextField), - второй(на нем будут мувы для рисования знаков дроби, корня и т.д.), вот на если у нас рисуется дробь, то на первом муве создается пустой мув, на нем еще два с текстовыми полями, если в поле находится курсор и добавить еще одну дробь - на предке этого поля создастса еще один мув с двумя другими+TextField, и т.д.
степень вложенности зависит от извращенности пользователя, дак вот надо найти самый верхний, для чего служит функция heard, но она рекурсивная из нее формируется стек, т.е последний блок выполняется первым, и результатом является мув возрашенный первым блоком(последним выполненым), а мне требо, чтоб последним(который выполняется первым).
- надеюсь не доконца всех запутал, проще в исходнике посмотреть структуру клипов.

etc 05.12.2006 01:46

А зачем второй вложенный цикл?

Рекурсия у тебя одна — собственно, вызов heard.

dacino 05.12.2006 01:59

1 - ну выше я пытался описать зачем, у меня два типа мувов, одни для создания сложных элементов а на других расположены эти элементы, вот мне нужны последние
2-это я только нахожу верхний мув, а надо еще от него дойти еще обратно до корня(с верху вниз без проблем, с подъемом сложности)

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

dacino 05.12.2006 19:43

искать надо мув расположенный на самом верхнем уровне, как это сделать пробовал так:
Код:

function heard(l_mc:MovieClip):MovieClip{
                var d:Number = l_mc.getNextHighestDepth();
                var el = null;
                for(var i = 0; i<d; i++){
                        el = l_mc.getInstanceAtDepth(i);
                        if(el instanceof MovieClip){                               
                                return heard(el);                               
                        }
                        else{
                                if(el instanceof TextField and d==1)
                                        return el._parent;                               
                        }
                }
        }

- это не работает, возращает первый найденный а не последний мув, как правильно должна выглядеть эта функция?
------

dacino 05.12.2006 19:55

все дело в return прекращающем выполнение функции, а есть ли аналог result'a в AS как иначе результату значению возвращаемому функцией присвоить что-то и продолжить ее выполнение?

etc 05.12.2006 20:45

А куда ты, собственно, элемент возвращаешь?

dacino 05.12.2006 21:33

ты про if не знаю куда и кому, но если писать просто heard(el); без return то рекурсия вообще не работает

dacino 05.12.2006 21:45

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

dacino 06.12.2006 01:51

такой вариант почти работает
Код:

function heard(l_mc:MovieClip):MovieClip{
        var d:Number = l_mc.getNextHighestDepth();
        var el = null, nel = null;
        for(var i = 0; i<d; i++){
                el = l_mc.getInstanceAtDepth(i);
                if(el instanceof MovieClip){                               
                        return heard(el);                               
                }
        }
        if (el instanceof TextField & d==1){
                return el._parent;
        }
}

только все дерево не обходится, а только его часть(первая попавшаяся ветвь), как его доделать, что дописать???
------
моих знаний AS и вообще ООП тут явно не хватает, поможите люди добрые


Часовой пояс GMT +4, время: 07:33.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.