遍历B树结构算法

时间:2017-04-20 00:08:13

标签: php algorithm b-tree b-tree-index

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

看看示例b-tree

btree graph

以下是我使用的样本数据集:

$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>";
}

问题:如何以最有效的方式实现此输出?

1 个答案:

答案 0 :(得分:0)

处理此类情况的最佳方法是使用递归函数。

driver.findElement(By.xpath("//div[1]/button[starts-with(@id,'dp')]")).click();
String js = "document.getElementById("field-label").style.display = "block";';
arguments[0].style.visibility='visible';";

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

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

我认为树的更好表现是:

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

但是这需要对上面的代码稍作修改。

获取数组作为响应:

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

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