首页 > 代码库 > 无限极分类查找所有子孙节点的改进算法
无限极分类查找所有子孙节点的改进算法
在以前,遇到无限极分类返回一个节点的所有子孙节点时,我都是用递归计算的,后来发现时间复杂度和空间复杂度都太高了,后来自己研究了一下改进了算法.
节点数据如下:键值对分别是自己对应父亲节点
<?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();?>
无限极分类查找所有子孙节点的改进算法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。