2012-05-11 154 views
0

所以假設我有一些有節點和子節點的樹形結構。當我看到某些節點時,我想穿過樹並吶喊。迭代遍歷樹形結構

看看下面的,這是動作腳本,但它類似於Java等:

for(var i:int=0; i<parent.children.length; i++) 
{ 
    child = parent.children[i]; 
    if(child.nodeName == "A") 
    { 
    parent = child; 
    for(var j:int=0; j<parent.children.length; j++) 
    { 
     child = parent.children[j]; 
     if(child.nodeName == "B") 
     { 
     trace("B found"); 
     parent = child; 
     //now search for C etc... 
     } 
    } 
    } 
} 

這個問題是與「父=子」行了,我想「跳」到再下一組兒童,但當然,當我回去時,我已經失去了對上述父母的提及。通常的做法是什麼?

回答

1

遞歸是樹一個美麗的東西:

public function walkTree(node:Tree) 
{ 
    //here is where you want to check the node's name against your list of 
    //'nodes to shout out about' 
    trace("Node found: " + node.nodeName); 


    for(var i:int=0; i < node.children.length; i++) 
    { 
     walkTree(node.children[i]); 
    } 
} 

注:遞歸是危險的,如果一個孩子節點都可以有它的父(或其父母的父母或父母的父母的父母等),因爲它會陷入循環。在使用遞歸時,確保沒有任何孩子參考父節點。

1

做一個遞歸函數來遍歷樹並檢查節點嗎?

一些代碼:

public function traverse(parent:Node, node:Node, search:Array):void 
{ 

    if (search.indexOf(node.nodeName) != -1) 
     trace("Found " + node.nodeName); 

    for(var i:int=0; i < node.children.length; i++) 
    { 
     traverse(node,node.children[i],search); 
    } 
}