先用一个数组表示一个二叉树搜索树,也就是一个排好序的二叉树,其中左子结点<根结点<右子结点
利用结构数组的形式来表示,id,left,right 代表结点id ,左子树 ,右子树
下面这个二维数组
$data[]=['id'=>8,'left'=>2,'right'=>10,'data'=>'test']; $data[]=['id'=>2,'left'=>1,'right'=>0,'data'=>'test1'$data[]=['id'=>10,'left'=>0,'data'=>'test2'$data[]=['id'=>1,'data'=>'test3'];
转换成成多维的树结构
$root=8; $tree=[]; //遍历 foreach($data as $k=>$v){ $refer[$v['id']]=&$data[$k];为每个数组成员建立对应关系 } 遍历2 ){ $left=&$v['left']]; $right=&$v['right'$k]['left']=&$left; $k]['right']=&$right; } 遍历3 ){ if($v['id']==$root$tree=; break; } }
结果是:
Array ( [id] => 8 [left] => ( [id] => 2 [left] => ( [id] => 1 [left] => [right] => [data] => test3 ) [right] => [data] => test1 ) [right] => ( [id] => 10 [left] => [right] => test2 ) [data] => test )
使用迭代的方式来查找,如果值比当前结点小,就把左子树赋给当前树 ,如果大就把右子树赋给当前树
function find($tree,$idwhile(is_array($tree)){ $id<$tree['id']){ $tree['left']; }elseif($id>$tree['right'else{ return ; } } return false; }
结果是:
$r=find(); ( [id] => 2 ( [id] => 1 test3 ) [right] => [data] => test1 )