码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-09-05 19:20:41      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:

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

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

<?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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!