1

我很难编写一个输出子节点父节点的遍历函数。

看一下示例 b-tree

btree 图

这是我正在使用的示例数据集:

$nodes = array(
  array('f','b'),
  array('f','g'),
  array('b','a'),
  array('b','d'),
  array('g','i'),
  array('d','c'),
  array('d','e'),
  array('i','h')
);

我正在尝试输出一个results包含所有包含父关联的子节点数组的数组。

示例输出:

  • 节点(d)的父母是(b,f)
  • 节点(c)的父母是(d,b,f)
  • 节点(h)的父母是(i,g,f)

我不知道如何遍历直接父节点。

foreach($nodes as $node){
    //CHECK IF NODE EXISTS
    if(array_key_exists($node[1],$results)){
        //DO NOTHING
        array_push($results[$node[1]],$node[0]);
    }
    else{
        //CREATE NEW CHILD ARRAY
        $results[$node[1]] = [];
        //PUSH PARENT INTO CHILD ARRAY
        array_push($results[$node[1]],$node[0]);
    }
}
foreach($results as $k => $v){
    echo "child[$k] parents(" . implode($v,', ').")" ; 
    echo "</br>";
}

问:我怎样才能在最有效率的庄园里实现这个输出?

4

1 回答 1

1

处理这种情况的最好方法是使用递归函数。

echo findParents('h',$nodes);

function findParents($find,$btree){
      $parents;
        foreach($btree as $node){
            if($node[1]===$find){
                $parents .=$find.',';
                return $parents .= findParents($node[0], $btree);
            }
        }
     return $find;
    }

在此处查看实时代码:https ://www.tehplayground.com/ElTdtP61DwFT1qIc

唯一的缺点是它会返回返回列表中的原始节点。但我认为你可以忍受这一点。

我认为树的更好表示是:

$nodes = array(
  'f'=>array('d','g'),
  'b'=>array('a','d'),
  'g'=>array('i'),
  'd'=>array('c','e'),
  'i'=>array('h')
);

但这需要对上述代码稍作修改。

获取一个数组作为响应:

function findParentsArray($find,$btree){
  $parentsArray = explode(',',findParents($find,$btree));
  array_shift($parentsArray);
  return $parentsArray;
}

应该可以直接在 findParents() 中完成,但我现在没有时间研究它。

于 2017-04-20T02:15:40.133 回答