1.首先我们得有一个树状结构的表,类似这种结构。必须得有 id,pid  其他的根据需要来。

我们叫它treeTbl表吧。这里pid为0的表示是顶级节点。

2.接着select * from treeTbl ,并将得到的list 转换成一个Map集合,

key 为 pid ,value 为 子元素对象集合或者子元素id集合之类的都可以,根据需要。

我这里只需要id,所以是定义为了List<string>类型。

		Map<String,List<String>> map=new HashMap<String,List<String>>();
for(Object[] obj : list)
{
String id=obj[0].toString();
String pid=obj[1].toString();
if(map!=null && map.get(pid)!=null){
map.get(pid).add(dic_id);
}else{
List<String> list_tmp=new ArrayList<String>();
list_tmp.add(id);
map.put(pid,list_tmp);
}
}

3.递归遍历,说明在注释中

	        //最终得到的子孙集合
List<String> idList=new ArrayList<String>(); /*
这个pid的值根据需要来,
如果要获取整棵树,这里就填根节点的id,treeTbl表中的根节点的 id 为 0
如果是获取指定父级节点下的所有子孙节点,就填该父节点的 id 值
*/
List<String> chidrenList=map.get(pid); /*
上面得到的chidrenList仅仅是底下一层的节点集合,也就是说只包含了子节点,未包含子节点下的所有子孙节点
如果变量pid表示第一层的话,这里我们从第二层开始递归
也就是不停的寻找下一层下一层下一层……直到不存在下一层为止
如何判断有无下一层呢,之前创建好的HashMap已存好父子关系,用它来判断就好 */
for(String id : childrenList){
//用于递归的方法,只有把 id 下的所有子孙节点全部存入idList,才会进行下一轮循环
getChildrens(map, id ,idList);
} //将之前第一层子节点也加入进来(这个地方根据需要来)
idList.addAll(chidrenList);
	 private void getChildrens(Map<String,List<String>> map,String id,List<String> idList)
{
//查询当前id下的子级的集合
List<String> list=map.get(id); //如果list不为空,则表示该id下还有子id,重新调用当前方法进行递归查询
if(list!=null && list.size()>0){
for(String id2 : list){
//存入集合
idList.add(id2);
//再查一次
getChildrens(map, id2, idList);
}
} }
  • 大小: 6.1 KB

Java 基本的递归写法的更多相关文章

  1. 快速排序基本思想,递归写法,python和java编写快速排序

    1.基本思想 快速排序有很多种编写方法,递归和分递归,分而治之法属于非递归,比递归简单多了.在这不使用代码演示.下面我们来探讨一下快速排序的递归写法思想吧. 设要排序的数组是A[0]……A[N-1], ...

  2. Java中的递归运算

    Java中的递归运算是一种在自己的方法内部调用自己的方法 递归的设计思想是:把一个复杂的问题,分解为若干个等同的子问题,重复执行,直到之问题能够简单到直接求解,这样复杂的问题就得以解决. 递归运算有两 ...

  3. Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法

    Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...

  4. [Java] [查找文件] [递归]]

    // 工具方法 private static FilenameFilter getFilter(final String mode) { return new FilenameFilter() { P ...

  5. Java中枚举的写法和用法

            在公司代码中,用了一大堆的枚举,看得我好懵逼.下面开始看看枚举怎么写和怎么用. 一.枚举的写法         关于枚举的写法,网上好多这方面的知识.这里直接贴一个我自己写的枚举类的代 ...

  6. 【笔试题】Java 中如何递归显示一个目录下面的所有目录和文件?

    笔试题 Java 中如何递归显示一个目录下面的所有目录和文件? import java.io.File; public class Test { private static void showDir ...

  7. 2018.3.31 java中的递归

    java中的递归 1.概念 定义一个方法时,出现本方法调用本方法的过程,称之为递归 2.特点 必然有一个边界条件 使用递归代码往往更简洁,可读性强 3.什么时候使用递归 n的阶乘和n的累加定义 f(n ...

  8. 关于java的递归写法,经典的Fibonacci数的问题

    经典的Fibonacci数的问题 主要想展示一下迭代与递归,以及尾递归的三种写法,以及他们各自的时间性能. public class Fibonacci { /*迭代*/ public static ...

  9. Java算法之递归打破及在真实项目中的使用实例

    开心一笑 刚才领导问开发:"你觉得这个项目的最大风险是什么",开发说:"加班猝死" , 气氛尴尬了一分钟!!! 提出问题 1.递归算法简单复习 2.如何实现递归 ...

随机推荐

  1. 28 I/O限制的异步操作

    28.2 C#的异步函数 private static async Task<string> IssueClientRequestAsync(string serverName, stri ...

  2. [forward] cmake, CMakeLists.txt梳理

    cmake intro 原文请见 cmake使用总结(转)-工程主目录CMakeList文件编写 在 Linux 下进行开发很多人选择编写 makefile 文件进行项目环境搭建,而makefile ...

  3. HUD 1426 Sudoku Killer (DFS)

    链接 : Here! 思路 : 记录下所有 "?" , 出现的位置, 然后 $DFS$ 一下, 对于每个位置来说都可以填充 $9$ 种数值, 然后对于判断填充是否合法需要三个标记数 ...

  4. Linux文件、目录属性

    文件.目录属性 可能有人觉得,文件这东西这么普通有什么好讲的,,,其实不然,在linux中一切皆文件,搞清楚文件的本质,将对我们大有裨益. 文件.目录属性简介 举个例子 randolf@localho ...

  5. ACdream 1032 Component

    Component Time Limit: 5000ms Memory Limit: 64000KB This problem will be judged on ACdream. Original ...

  6. [HDU3518]Boring counting(后缀数组)

    传送门 求出现超过1次的不重叠子串的个数 根据论文中的方法. 枚举子串的长度 k. 用 k 给 height 数组分组,每一组求解,看看当前组的位置最靠后的后缀和位置最靠前的后缀所差个数是否大于长度, ...

  7. 清北学堂模拟赛d3t6 c

    分析:比较神奇的一道题.要把树变成环肯定要先变成链,然后把链给拼接成环.接下来考虑一个脑洞大开的树形dp:设f[i][0]表示i不与父节点相连的链数,f[i][1]表示i与父节点相连的链数,先考虑怎么 ...

  8. [TS-A1486][2013中国国家集训队第二次作业]树[树的重心,点分治]

    首先考虑暴力,可以枚举每两个点求lca进行计算,复杂度O(n^3logn),再考虑如果枚举每个点作为lca去枚举这个点的子树中的点复杂度会大幅下降,如果我们将每个点递归考虑,每次计算过这个点就把这个点 ...

  9. [bzoj3694]最短路_树链剖分_线段树

    最短路 bzoj-3694 题目大意:给你一个n个点m条边的无向图,源点为1,并且以点1为根给出最短路树.求对于2到n的每个点i,求最短路,要求不经过给出的最短路树上的1到i的路径上的最后一条边. 注 ...

  10. Hibernate数据缓存攻略

    目录 第一章 缓存策略概述 第二章 hibernate不使用缓存的问题 第三章 一级缓存介绍 第四章 二级缓存 第五章 一二级缓存对比及总结 源代码: https://github.com/weili ...