Tree遍历的算法 [转]

public function walkTree(tree:Tree, item:Object, startAtParent:Boolean = false):void
{
    
// get the Tree's data descriptor
    var descriptor:ITreeDataDescriptor = tree.dataDescriptor;
    var cursor:IViewCursor;
    
    var parentItem:Object;
    var childItem:Object;
    var childItems:Object;
    
    
// if the item is null, stop
    if(item == null)
        
return;
        
    
// do we back up one level to the item's parent
    if(startAtParent)
    
{
        
// get the parent
        parentItem = tree.getParentItem(item);
        
// is the parent real
        if(parentItem)
        
{
            trace(
"|-- Parent Node ", parentItem[tree.labelField]);
            
// if the parent is a branch
            if(descriptor.isBranch(parentItem))
            
{
                
// if the branch has children to run through
                if(descriptor.hasChildren(parentItem))
                
{
                    
// get the children of the branch
                    
// this part of the algorithm contains the item
                    
// passed
                    childItems = descriptor.getChildren(parentItem);
                }

            }

            
// if the branch has valid child items
            if(childItems)
            
{
                
// create our back step cursor
                cursor = childItems.createCursor();
                
// loop through the items parent's children (item)
                while(!cursor.afterLast)
                
{
                    
// get the current child item
                    childItem = cursor.current; 
                    var label:String 
= childItem[tree.labelField];
                    var branch:Boolean 
= descriptor.isBranch(childItem);
                    
                    
// good place for a custom method()
                    trace("Sibling Nodes :: ", label, "Is Branch :: ", branch); 
                    
                    
// if the child item is a branch
                    if(descriptor.isBranch(childItem))
                        
// traverse the childs branch all the way down 
                        
// before returning
                        walkTree(tree, childItem);
                    
// do it again!
                    cursor.moveNext();
                }

            }

        }

    }

    
else// we don't want the parent OR this is the second iteration
    {
        
// if we are a branch
        if(descriptor.isBranch(item))
        
{
            
// if the branch has children to run through
            if(descriptor.hasChildren(item))
            
{
                
// get the children of the branch
                childItems = descriptor.getChildren(item);
            }

            
            
// if the child items exist
            if(childItems)
            
{
                
// create our cursor pointer
                cursor = childItems.createCursor();
                
// loop through all of the children
                
// if one of these children are a branch we will recurse
                while(!cursor.afterLast)
                
{
                    
// get the current child item
                    childItem = cursor.current;

                    var label:String 
=  childItem[tree.labelField];
                    var branch:Boolean 
= descriptor.isBranch(childItem);
                    
                    
// good place for a custom method()
                    trace("-- Sub Node :: ", label, "Is Branch :: ", branch); 

                    
// if the child item is a branch
                    if(descriptor.isBranch(childItem))
                        
// traverse the childs branch all the way down 
                        
// before returning
                        walkTree(tree, childItem);
                    
// check the next child
                    cursor.moveNext();
                }

            }

        }

    }

}

////////////////
DFS看看懂,拿来用就行了
posted @ 2007-03-02 10:24  fishert  阅读(958)  评论(0编辑  收藏  举报