宽度优先遍历算法求部门树

CleverCode在实际的工作中,会经常遇到对部门节点,求子部门的情况,其实这用算法中的宽度优先遍历算法就可以了。

 

数据结构如下:

    

 

 

宽度优先遍历的算法,是一级一级的往查找下找,比如需要找技术部门的所有的子部门,那么先让技术部门入队列。然后让技术部门出队列,让技术部门的孩子节点测试部和php部门入队列,保存到栈中;然后在让测试部门出队列,让测试部门的孩子节点测试一组和测试二组入队列,并保存到栈中。。。。直到队列为空,那么栈里面的结果就是所有的孩子节点。

 

php宽度优先遍历算法如下:

 

/**
     * 获取下级部门ID
     * @param unknown $departmentId
     * @return multitype:
     */
    public function getChildIds($departmentId)
    {/*{{{*/
        $ids = array();
        if($departmentId < 1)
        {
            return $ids;
        }
        
        //从表中中获取所有数据;
        $departments = $DataBase->queryAll('department');
        if(false == is_array($departments) || count($departments) < 1)
        {
            return $ids;
        }

        //自己的孩子节点hash
        $allFatherHash = array();
        foreach($departments as $department)
        {
            if(false == isset($allFatherHash[$department['parentid']]))
            {
                $allFatherHash[$department['parentid']] = array();
            }
            $allFatherHash[$department['parentid']][]  = $department;
        }
             

        //队列和栈
        $queue = array($departmentId);
        
        while(count($queue) > 0)
        {
            //出队列
            $tmpId = array_shift($queue);

            //没有孩子节点
            if(false == isset($allFatherHash[$tmpId]))
            {
                continue;
            }
            
            $childs = $allFatherHash[$tmpId];
            foreach($childs as $department)
            {
                //孩子入队列
                $queue[] = $department['id'];

                //孩子的入栈                                  
                $ids[] = $department['id'];                
            }
        }
        return $ids;
    }/*}}}*/

 

 

技术交流

CleverCode是一名架构师,技术交流,咨询问题,请加CleverCode创建的qq群(架构师俱乐部):517133582。加群和腾讯,阿里,百度,新浪等公司的架构师交流。【架构师俱乐部】宗旨:帮助你成长为架构师!

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值