在树数据结构中按id查找元素

时间:2016-10-04 19:16:59

标签: php tree php-5.3

树样本:

           root
           / | \
          1  2  4
         /      /|\
        3      5 6 7
       / \
      13 14

我有一个函数,即树中的搜索元素递归。例如,我想找到元素#6

public function getChildById($root,$id){

        if (!empty($root->nodes)){
            foreach ($root->nodes as $node){

                echo $node->getId()."<br>";

                if ($node->getId()==$id){
                    //if i wrote here 'echo $node->getId(), it successful find current way and last id, but the result of that return is nothing'
                    return $node;
                }else{
                    //if i add here return , it newer find 6 elemement, it stops on 13
                    /*return*/ $this->getChildById($node, $id);  
                }

            }
        }
    }

我写了一些评论,请帮助我,我做错了什么?

1 个答案:

答案 0 :(得分:2)

事实确实在中间:当你没有返回递归调用的值时,你会丢失你收集的信息。另一方面,当您返回递归调用的值时,它将无效,因为您将在foreach循环的第一次迭代中始终返回。

所以,你需要有时候返回它:只有当你在递归部分有一个匹配时。如果没有成功,则不应返回并继续foreach循环:

public function getChildById($root, $id){
    if (!empty($root->nodes)){
        foreach ($root->nodes as $node){
            if ($node->getId()==$id){
                return $node;
            } else {
                $found = $this->getChildById($node, $id);
                if ($found) return $found;
            }           
        }
    }
}   

eval.in上看到它。

请注意,在根上进行匹配测试更常见,因此在函数的开头。它归结为同样的事情,除了如果值在你调用函数的根上,它也被发现!

public function getChildById($root, $id){
    if ($root->getId()==$id) return $root;
    foreach ($root->nodes as $node){
        $found = $this->getChildById($node, $id);
        if ($found) return $found;
    }           
}