0

所以假设我有某种带有节点和子节点的树结构。当我看到某些节点时,我想穿过树并大喊。

看下面,这是 ActionScript 但它类似于 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...
      }
    }
  }
}

问题出在'parent = child'行,我想“跳”到下一组孩子,但当然当我回去时,我失去了对上面父母的引用。解决这个问题的通常方法是什么?

4

2 回答 2

2

递归对树来说是一件美妙的事情:

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]);
    } 
}

注意:如果其中一个子节点可以拥有其父节点(或其父节点的父节点,或其父节点的父节点的父节点等),则递归是危险的,因为它将陷入循环。使用递归时,确保没有子节点引用父节点。

于 2012-05-11T16:23:41.290 回答
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);
    }
}
于 2012-05-11T16:21:01.030 回答