首页 > 代码库 > 无限极分类查找所有子孙节点的改进算法

无限极分类查找所有子孙节点的改进算法

在以前,遇到无限极分类返回一个节点的所有子孙节点时,我都是用递归计算的,后来发现时间复杂度和空间复杂度都太高了,后来自己研究了一下改进了算法.

节点数据如下:键值对分别是自己对应父亲节点

<?php$tree=array(1=>0,2=>1,3=>2,4=>3,5=>4,6=>5,7=>6,8=>7,9=>8,10=>9,11=>10,);?>

 

以往算法如下:

<?phpfunction get_list($tree,$id=0){  static $list=array();//定义静态数组存放子孙  foreach ($tree as $key => $v)   {        if($v==$id)        {            $list[]=$key;//把子孙放入数组中            unset($tree[$key]);//去掉这个数组的键 避免无效循环            get_list($tree,$key);//再次调用自身,把子节点变成父节点去寻找子孙        }    }    return $list;//返回数组}?>

然而这样的算法在遇到节点层级非常深的时候会崩溃,例如超过100层,php会报错误的。后来改进了一种算法如下:

<?php$id=2;$new_array=array();//存放子孙的数组$id_list[]=$id;//存放父亲的数组//遍历所有子孙数据 每次去取已经有的数据的子孙 并把它加入父亲数组for ($i=1; $i <= count($tree); $i++) {     foreach ($tree as $key => $v)     {        if( in_array($v,$id_list) )         {            $new_array[$key]=$v;//把我放进子孙数组            $id_list[$key]=$key;//把子孙也放入父亲数组            unset($tree[$key]);//这个已经用过了可以回收了避免无效循环        }    }}$son_list=array_keys($new_array);//拿到存放子孙的数组 取键即可print_r($son_list);exit();?>

 

无限极分类查找所有子孙节点的改进算法