精华内容
下载资源
问答
  • 1. 递归查询树tree结构有两种做法:第一种,递归查询数据库结构,第二种,一次性将数据库表中的所有数据查出来,然后再... 反向递归(逆向递归)查询树tree结构根据关键字过滤数据大家有么有遇到过这个问题:我想要...

    1. 递归查询树tree结构有两种做法:

    第一种,递归查询数据库结构,

    第二种,一次性将数据库表中的所有数据查出来,然后再递归查出来的list集合,

    第一种做法适合数据量较少的tree结构,因为要一直查询数据库数据量大时速度回相对较慢,所以数据量大时建议使用第二种方法,如图1所示是一个常见的树tree结构

    图1

    0818b9ca8b590ca3270a3433284dd417.png

    2. 反向递归(逆向递归)查询树tree结构根据关键字过滤数据

    大家有么有遇到过这个问题:我想要根据关键字过滤查询出相关数据和它的上级结构,得到图1所示结果,可往往不知道怎么做,查不出上级结构总是得到图3类似的结构,要解决这个比较常见的问题就要用到反向递归的算法,网上我那个网搜不到类似的解决方案,本人一时兴趣来了,做了一套递归和反递归的解决方案,简单易懂,大家可以相互交流一下

    图2

    0818b9ca8b590ca3270a3433284dd417.png

    0818b9ca8b590ca3270a3433284dd417.png

    图3

    0818b9ca8b590ca3270a3433284dd417.png

    0818b9ca8b590ca3270a3433284dd417.png

    3.示例代码

    /**

    * 说明方法描述:将list转为树tree结构

    *

    * @param allRrecords

    * @return

    * @time 2016年5月10日 下午6:00:35

    * @author yangdong

    */

    public List useListRecordToTree(List allRrecords) {

    List listParentRecord = new ArrayList();

    List listNotParentRecord = new ArrayList();

    // 第一步:遍历allRrecords保存所有数据的uuid用于判断是不是根节点

    Map mapAllUuid = new HashMap();

    Map allRecordMap = new HashMap();

    for (Record record : allRrecords) {

    mapAllUuid.put(record.getStr("uuid"), record.getStr("uuid"));

    allRecordMap.put(record.getStr("uuid"), record);

    }

    // 第二步:遍历allRrecords找出所有的根节点和非根节点

    if (allRrecords != null && allRrecords.size() > 0) {

    for (Record record : allRrecords) {

    if (StringUtil.isBlank(record.getStr("parent_uuid"))

    || !mapAllUuid.containsKey(record.getStr("parent_uuid"))) {

    listParentRecord.add(record);

    } else {

    listNotParentRecord.add(record);

    }

    }

    }

    // 第三步: 递归获取所有子节点

    if (listParentRecord.size() > 0) {

    for (Record record : listParentRecord) {

    // 添加所有子级

    record.set("childs", this.getTreeChildRecord(listNotParentRecord, record.getStr("uuid")));

    }

    }

    return listParentRecord;

    }

    /**

    * 说明方法描述:使list转换为树并根据关键字和节点名称过滤

    *

    * @param allRecords 所有节点

    * @param keywords 要过滤的关键字

    * @param filterFields 要过滤的字段

    * @return

    * @time 2016年5月19日 下午3:27:32

    * @author yangdong

    */

    public List useListRecordToTreeByKeywords(List allRecords, String keywords, String... filterFields) {

    List listRecord = new ArrayList();

    Map allRecordMap = new HashMap();

    for (Record record : allRecords) {

    allRecordMap.put(record.getStr("uuid"), record);

    }

    // 遍历allRrecords找出所有的nodeName和关键字keywords相关的数据

    if (allRecords != null && allRecords.size() > 0) {

    if (filterFields.length > 1) {

    for (Record record : allRecords) {

    for (String field : filterFields) {

    // 比较

    if (record.getStr(field).toLowerCase().indexOf(keywords.toLowerCase()) != -1) {

    listRecord.add(record);

    }

    }

    }

    } else {

    for (Record record : allRecords) {

    // 比较

    if (record.getStr(filterFields[0]).toLowerCase().indexOf(keywords.toLowerCase()) != -1) {

    listRecord.add(record);

    }

    }

    }

    }

    // 查找过滤出来的节点和他们的父节点

    listRecord = this.getSelfAndTheirParentRecord(listRecord, new ArrayList(),

    new HashMap(), allRecordMap);

    // 将过滤出来的数据变成树tree结构

    listRecord = this.useListRecordToTree(listRecord);

    return listRecord;

    }

    /**

    * 说明方法描述:递归查询子节点

    *

    * @param childList 子节点

    * @param parentUuid 父节点id

    * @return

    * @time 2016年5月10日 下午3:29:35

    * @author yangdong

    */

    private List getTreeChildRecord(List childList, String parentUuid) {

    List listParentRecord = new ArrayList();

    List listNotParentRecord = new ArrayList();

    // 遍历tmpList,找出所有的根节点和非根节点

    if (childList != null && childList.size() > 0) {

    for (Record record : childList) {

    // 对比找出父节点

    if (StringUtil.equals(record.getStr("parent_uuid"), parentUuid)) {

    listParentRecord.add(record);

    } else {

    listNotParentRecord.add(record);

    }

    }

    }

    // 查询子节点

    if (listParentRecord.size() > 0) {

    for (Record record : listParentRecord) {

    // 递归查询子节点

    record.set("childs", getTreeChildRecord(listNotParentRecord, record.getStr("uuid")));

    }

    }

    return listParentRecord;

    }

    /**

    * 说明方法描述:递归找出本节点和他们的父节点

    *

    * @param parentList 根据关键字过滤出来的相关节点的父节点

    * @param resultList 返回的过滤出来的节点

    * @param filterRecordMap 已经过滤出来的节点

    * @param allRecordMap 所有节点

    * @return

    * @time 2016年5月19日 上午9:53:56

    * @author yangdong

    */

    private List getSelfAndTheirParentRecord(List parentList, List resultList,

    Map filterRecordMap,

    Map allRecordMap) {

    // 当父节点为null或者节点数量为0时返回结果,退出递归

    if (parentList == null || parentList.size() == 0) {

    return resultList;

    }

    // 重新创建父节点集合

    List listParentRecord = new ArrayList();

    // 遍历已经过滤出来的节点

    for (Record record : parentList) {

    String uuid = record.getStr("uuid");

    String parent_uuid = record.getStr("parent_uuid");

    // 如果已经过滤出来的节点不存在则添加到list中

    if (!filterRecordMap.containsKey(uuid)) {

    listParentRecord.add(record);// 添加到父节点中

    filterRecordMap.put(uuid, record);// 添加到已过滤的map中

    allRecordMap.remove(uuid);// 移除集合中相应的元素

    resultList.add(record);// 添加到结果集中

    }

    // 找出本节点的父节点并添加到listParentRecord父节点集合中,并移除集合中相应的元素

    if (StringUtil.isNotBlank(parent_uuid)) {

    Record parentRecord = allRecordMap.get(parent_uuid);

    if (parentRecord != null) {

    listParentRecord.add(parentRecord);

    allRecordMap.remove(parent_uuid);

    }

    }

    }

    // 递归调用

    getSelfAndTheirParentRecord(listParentRecord, resultList, filterRecordMap, allRecordMap);

    return resultList;

    }

    //示例

    /**

    * 说明方法描述:递归查询所有权限

    *

    * @param keyword

    * @param is_deleted

    * @return

    * @time 2016年5月10日 下午3:47:50

    * @author yangdong

    */

    public List getRecordByKeywordRecursive(String keyword, String is_deleted) {

    // 第一步:查询所有的数据

    StringBuffer sql = new StringBuffer(

    " select pa.uuid,pa.parent_uuid,pa.author_code,pa.author_name,pa.is_menu,pa.sort_number,pa.is_enable,pa.menu_icon ");

    sql.append("  from s_author pa");

    List params = new ArrayList();

    sql.append(" where  pa.is_deleted=? ");

    params.add(is_deleted);

    sql.append(" order by pa.sort_number asc ");

    List allRrecords = Db.use(AppConst.DB_DATASOURCE_MAIN).find(sql.toString(), ParamUtil.listToArray(params));

    //第二步:将list变为树tree结构

    if (StringUtil.isNotBlank(keyword)) {

    return super.useListRecordToTreeByKeywords(allRrecords, keyword, "author_name");

    } else {

    return super.useListRecordToTree(allRrecords);

    }

    }

    ----------------------------------------------------------------------------------------------------------------------------------------

    如果您认为本教程质量不错,读后觉得收获很大,预期工资能蹭蹭蹭的往上涨,那么不妨小额赞助我一下,让我有动力继续写出高质量的教程。 ----------------------------------------------------------------------------------------------------------------------------------------

    0818b9ca8b590ca3270a3433284dd417.png    

    0818b9ca8b590ca3270a3433284dd417.png

    展开全文
  • PHP反向递归

    2021-04-28 06:29:19
    试试我这个:function createMenuTree($data = array(), $pid = 0){if (empty($data)){return array();}static $level = 1;$returnArray = array();foreach ($data as $node){if ($node['parent_id'] == $pid){$...

    试试我这个:

    function createMenuTree($data = array(), $pid = 0){

    if (empty($data)){

    return array();

    }

    static $level = 1;

    $returnArray = array();

    foreach ($data as $node){

    if ($node['parent_id'] == $pid){

    $returnArray[] = array(

    'cat_id' => $node['cat_id'],

    'cat_name' => $node['cat_name'],

    'level' => $level,

    'parent_id' => $node['parent_id'],

    'show_in_nav' => $node['show_in_nav'],

    'is_show' => $node['is_show'],

    'sort_order' => $node['sort_order']

    );

    if (hasChild($node['cat_id'], $data)){

    $level++;

    $returnArray = array_merge($returnArray, createMenuTree($data, $node['cat_id']));

    $level--;

    }

    }

    }

    return $returnArray;

    }

    function hasChild($cid, $data){

    $hasChild = false;

    foreach ($data as $node){

    if ($node['parent_id'] == $cid){

    $hasChild = true;

    break;

    }

    }

    return $hasChild;

    }

    字段跟你的不是很一样,但是思路好像跟你想要的差不多,你可以自己拿去修改一下。

    展开全文
  • java递归和反向递归

    2021-02-12 21:46:58
    } } } // 第三步: 递归获取所有子节点 if (listParentRecord.size() > 0) { for (Record record : listParentRecord) { // 添加所有子级 record.set("childs", this.getTreeChildRecord...

    /**

    * 说明方法描述:将list转为树tree结构

    *

    * @param allRrecords

    * @return

    * @time 2016年5月10日 下午6:00:35

    * @author yangdong

    */

    public List useListRecordToTree(List allRrecords) {

    List listParentRecord = new ArrayList();

    List listNotParentRecord = new ArrayList();

    // 第一步:遍历allRrecords保存所有数据的uuid用于判断是不是根节点

    Map mapAllUuid = new HashMap();

    Map allRecordMap = new HashMap();

    for (Record record : allRrecords) {

    mapAllUuid.put(record.getStr("uuid"), record.getStr("uuid"));

    allRecordMap.put(record.getStr("uuid"), record);

    }

    // 第二步:遍历allRrecords找出所有的根节点和非根节点

    if (allRrecords != null && allRrecords.size() > 0) {

    for (Record record : allRrecords) {

    if (StringUtil.isBlank(record.getStr("parent_uuid"))

    || !mapAllUuid.containsKey(record.getStr("parent_uuid"))) {

    listParentRecord.add(record);

    } else {

    listNotParentRecord.add(record);

    }

    }

    }

    // 第三步: 递归获取所有子节点

    if (listParentRecord.size() > 0) {

    for (Record record : listParentRecord) {

    // 添加所有子级

    record.set("childs", this.getTreeChildRecord(listNotParentRecord, record.getStr("uuid")));

    }

    }

    return listParentRecord;

    }

    /**

    * 说明方法描述:使list转换为树并根据关键字和节点名称过滤

    *

    * @param allRecords 所有节点

    * @param keywords 要过滤的关键字

    * @param filterFields 要过滤的字段

    * @return

    * @time 2016年5月19日 下午3:27:32

    * @author yangdong

    */

    public List useListRecordToTreeByKeywords(List allRecords, String keywords, String... filterFields) {

    List listRecord = new ArrayList();

    Map allRecordMap = new HashMap();

    for (Record record : allRecords) {

    allRecordMap.put(record.getStr("uuid"), record);

    }

    // 遍历allRrecords找出所有的nodeName和关键字keywords相关的数据

    if (allRecords != null && allRecords.size() > 0) {

    if (filterFields.length > 1) {

    for (Record record : allRecords) {

    for (String field : filterFields) {

    // 比较

    if (record.getStr(field).toLowerCase().indexOf(keywords.toLowerCase()) != -1) {

    listRecord.add(record);

    }

    }

    }

    } else {

    for (Record record : allRecords) {

    // 比较

    if (record.getStr(filterFields[0]).toLowerCase().indexOf(keywords.toLowerCase()) != -1) {

    listRecord.add(record);

    }

    }

    }

    }

    // 查找过滤出来的节点和他们的父节点

    listRecord = this.getSelfAndTheirParentRecord(listRecord, new ArrayList(),

    new HashMap(), allRecordMap);

    // 将过滤出来的数据变成树tree结构

    listRecord = this.useListRecordToTree(listRecord);

    return listRecord;

    }

    /**

    * 说明方法描述:递归查询子节点

    *

    * @param childList 子节点

    * @param parentUuid 父节点id

    * @return

    * @time 2016年5月10日 下午3:29:35

    * @author yangdong

    */

    private List getTreeChildRecord(List childList, String parentUuid) {

    List listParentRecord = new ArrayList();

    List listNotParentRecord = new ArrayList();

    // 遍历tmpList,找出所有的根节点和非根节点

    if (childList != null && childList.size() > 0) {

    for (Record record : childList) {

    // 对比找出父节点

    if (StringUtil.equals(record.getStr("parent_uuid"), parentUuid)) {

    listParentRecord.add(record);

    } else {

    listNotParentRecord.add(record);

    }

    }

    }

    // 查询子节点

    if (listParentRecord.size() > 0) {

    for (Record record : listParentRecord) {

    // 递归查询子节点

    record.set("childs", getTreeChildRecord(listNotParentRecord, record.getStr("uuid")));

    }

    }

    return listParentRecord;

    }

    /**

    * 说明方法描述:递归找出本节点和他们的父节点

    *

    * @param parentList 根据关键字过滤出来的相关节点的父节点

    * @param resultList 返回的过滤出来的节点

    * @param filterRecordMap 已经过滤出来的节点

    * @param allRecordMap 所有节点

    * @return

    * @time 2016年5月19日 上午9:53:56

    * @author yangdong

    */

    private List getSelfAndTheirParentRecord(List parentList, List resultList,

    Map filterRecordMap,

    Map allRecordMap) {

    // 当父节点为null或者节点数量为0时返回结果,退出递归

    if (parentList == null || parentList.size() == 0) {

    return resultList;

    }

    // 重新创建父节点集合

    List listParentRecord = new ArrayList();

    // 遍历已经过滤出来的节点

    for (Record record : parentList) {

    String uuid = record.getStr("uuid");

    String parent_uuid = record.getStr("parent_uuid");

    // 如果已经过滤出来的节点不存在则添加到list中

    if (!filterRecordMap.containsKey(uuid)) {

    listParentRecord.add(record);// 添加到父节点中

    filterRecordMap.put(uuid, record);// 添加到已过滤的map中

    allRecordMap.remove(uuid);// 移除集合中相应的元素

    resultList.add(record);// 添加到结果集中

    }

    // 找出本节点的父节点并添加到listParentRecord父节点集合中,并移除集合中相应的元素

    if (StringUtil.isNotBlank(parent_uuid)) {

    Record parentRecord = allRecordMap.get(parent_uuid);

    if (parentRecord != null) {

    listParentRecord.add(parentRecord);

    allRecordMap.remove(parent_uuid);

    }

    }

    }

    // 递归调用

    getSelfAndTheirParentRecord(listParentRecord, resultList, filterRecordMap, allRecordMap);

    return resultList;

    }

    展开全文
  • mysql递归搜索再之前得原创文档里已经写明了,这个网上比较多。直接进入正题:原创手写反递归package com.kb.nxccims.common.util;import java.util.ArrayList;import java.util.List;import ...

    mysql递归搜索再之前得原创文档里已经写明了,这个网上比较多。

    直接进入正题:原创手写反递归

    package com.kb.nxccims.common.util;

    import java.util.ArrayList;

    import java.util.List;

    import com.kb.nxccims.expandmodel.UnitVO;

    /**

    * @author 叶成浪

    * @time 2018年7月12日 - 上午11:06:06

    * @email yechenglang521@163.com

    **/

    public class UnitRecursionUtils {

    private UnitRecursionUtils() {

    }

    private static ListrList = null;

    private static UnitRecursionUtils unitRecursionUtils = null;

    public static ListgetInstance(Listlist) {

    if (rList == null) {

    rList = new ArrayList();

    }

    synchronized (rList) {

    unitRecursionUtils = new UnitRecursionUtils();

    return unitRecursionUtils.getUnitList(list);

    }

    }

    // YCL递归查询下级单位ID

    private ListgetUnitList(Listlist) {

    if (!rList.isEmpty()) {

    return rList;

    }

    for (int i = 0; i < list.size(); i++) {

    rList.add(list.get(i).getId());

    uVO(list.get(i).getuList());

    }

    return rList;

    }

    // YCL递归循环下级所有ID

    private static ListuVO(Listuvo) {

    Listlist2 = new ArrayList();

    for (int i = 0; i < uvo.size(); i++) {

    rList.add(uvo.get(i).getId());

    if (uvo.get(i).getuList().isEmpty()) {

    return null;

    } else {

    list2.addAll(uvo.get(i).getuList());

    }

    }

    if (uvo.size() <= 0) {

    return null;

    }

    return uVO(list2);

    }

    }

    原创版权,未经允许,不得转载。

    展开全文
  • 我已经尝试了各种递归函数的方法,但只有在深度为2时才设法获得正确的结果 . 我找到了这个函数,但它似乎返回键的名称而不是值: function find_parent($array, $needle, $parent = null) { foreach ($array as $key...
  • * 递归组装数据 * options 数结构 * code 最后一级的 id * parentHalfKeys 半选的父节点节点 */ recursion(options, code, parentHalfKeys) { let result = [], // 递归结果 tempArry = []; // 缓存数据 // ...
  • import java.io.File;public class FileTest2{publicstaticintcount=0;publicstaticvoidparse(File[]files){if(files.length==0){FileTest2.count--;System.out.println();return;}else{...
  • 原代码:private static JSONArray produceTree(List resources,boolean needPermission){JSONArray tree = new JSONArray();if(resources!=null&...Number.ZERO) {//递归退出条件判断for (Resource r...
  • 创建mysql函数 fun_Knowledge_child_url, 输入一个int类型节点chId,return一个url字符串BEGINDECLAREsTempVARCHAR(1000);DECLAREsTempChdVARCHAR(1000);DECLAREknoNameVARCHAR(100);DECLAREtempPidINT;...
  • 递归:数字反转

    2021-05-19 15:50:03
    } //输出1,2,3 public static void reverse(int a){ //如果是a==0就结束递归 if(a==0){ return; } int num = a%10; reverse(a/10); System.out.println(num); } //反转输出3,2,1 public static int revers(int a){ ...
  • table2b wherea.no=b.no ) whereconnect_by_isleaf=1 startwithparent_no='A'andrn=1 connectbypriorno=parent_noandrn=1 实现二:代码中的C表实际就是每个用户之间的位置层次关系(就相当于一个递归sql,已经形成表...
  • 通过mybatis递归查询部门树Tree Association与Collection Association元素处理“has-one”(一对一)这种类型关系。联合映射与其它的结果集映射工作方式差不多,如:一个 user 有 一个 role。 指定property、column...
  • 递归图解:每次递归时,都会创建一个字符变量C来保存字符串首位元素,然后将字符串末尾元素赋给首位同时字符串的起始位置都会向后推移一位,而结尾位置都会向前推移一位,而在递归完成后,会将C中保存的字符赋给字符...
  • 在遍历城市,树等大脑里反应出来的第一方法大多就属于这个了递归容易使用,但是也容易用坏,我想"内存溢出"这个估计是每个人用递归都会碰到的bug,我为什么还是要写这方面的知识呢,那是因为文章的最后我有一个问题...
  • mysql逆向递归树查询

    2021-01-19 05:47:48
    创建mysql函数 fun_Knowledge_child_url, 输入一个int类型节点chId,return一个url字符串BEGINDECLAREsTempVARCHAR(1000);DECLAREsTempChdVARCHAR(1000);DECLAREknoNameVARCHAR(100);DECLAREtempPidINT;...
  • 展开全部简单做了几条数据,我这应该是没问62616964757a686964616fe78988e69d8331333332643337题,只是不知道拿到你那会怎么样,有问题直接回复测试数据createtabletest(parent_idint,idint,is_rpint,namevarchar2...
  • package com.lsn.ams;import ...import java.util.*;import java.util.ArrayList;import java.util.LinkedHashMap;import java.util.List;import java.util.Map;public class Test {pub...
  • 使用队列而不是递归.我想你可以这样做……extension UIView {func changeColor(color: UIColor) {var queue = [self]while let view = queue.first() {queue += view.subviewsview.backgroundColor = colorqueue....
  • 本篇文章就给大家介绍PHP使用递归调用来反向输出字符串。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。首先我们了解一下递归调用是什么?递归调用:是某个函数调用自己或者是在调用其他函数后...
  • 给定一个仅包含数字0-9的二叉树,每一条从根节点到叶子节点的路径都可以用一个数字表示。 例如根节点到叶子节点的一条路径是,那么这条路径就用来代替。 找出根节点到叶子节点的所有路径表示的数字之和 ...
  • lodash常用的一些方法

    2021-01-25 21:41:07
    ) 官网的解释是,递归的将源对象和继承的可枚举字符串监控属性合并到目标对象中。源对象从左到右引用,后续来源将覆盖以前来源的属性分配。 var object = { 'a': [{ 'b': 2 }, { 'd': 4 }] }; var other = { 'a': ...
  • YDOOK:Pytorch教程:Numpy 手动设置反向梯度递归 神经网络 © YDOOK Jinwei Lin, shiye.work 文章目录YDOOK:Pytorch教程:Numpy 手动设置反向梯度递归 神经网络© YDOOK Jinwei Lin, shiye.workCode:Outcome:1. ...
  • 最近有很多面试者在群里面问我,算法怎么实现链表的反转。所以我写了个demo 实现它,代码可以直接运行并且是一定能够.../*** java 实现链表反向demo*/public class test {class Node{private int data;private No...
  • 链表定义class ListNode {...}}非递归实现很简单,只需要遍历一遍链表,在遍历过程中,把遍历的节点一次插入到头部。public ListNode reverseList(ListNode head) {ListNode prev = null;while(head!=null){ListNode...
  • 这是面试中出现频率较高的问题,可以使用循环实现逆置也可以用递归的实现,首先为大家展示循环的方法,这是比较简单也更容易理解的,下面看代码#define _CRT_SECURE_NO_WARNINGS 1#include#includeReverse(char arr...
  • 反向输出一个链表(共5个数)递归方法 #include<stdio.h> #include<stdlib.h> typedef struct link { int data; struct link *next; }LINK; LINK *add(LINK *head,int n); void reverse(LINK *p); int ...
  • 递归法反转单链表

    2021-02-10 08:57:01
    链表是一种递归结构,因此将其与函数式一起使用将产生最佳结果。在您的程序中,您已经使用过程样式和mutable节点实现了一个链接列表,您将随着时间的推移更改data和{}的值。虽然这可能感觉像是一种直观的方法,但我...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 59,556
精华内容 23,822
关键字:

反向递归