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

来源:互联网 发布:大数据具有哪些特征 编辑:程序博客网 时间:2024/05/19 22:06

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;    }/*}}}*/


2 0
原创粉丝点击