标签:
在以前,遇到无限极分类返回一个节点的所有子孙节点时,我都是用递归计算的,后来发现时间复杂度和空间复杂度都太高了,后来自己研究了一下改进了算法.
节点数据如下:键值对分别是自己对应父亲节点
<?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, ); ?>
以往算法如下:
<?php function 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(); ?>
标签:
原文地址:http://www.cnblogs.com/lizhaoyao/p/5843002.html