在公司项目中用递归生成 Tree 时,出现了很严重的性能问题,在google 中 go 很久,也没有找到不用递归实现无限级 Tree 的算法。后来,抱着尝试的心理。结果,我用两个循环就搞定了。自认为这个算法应该很高效,以后递归树的地方我就用这个算法了。不过,需要注意的是,你的数据必须是根据ID从小到大排过序的。否则,就会显示不正确。如果数据无序,建议你先排序然后才调用此算法。看来,我还是相当聪明的嘛,嘿嘿
以下是代码:
public static void main(String[] args)
{
/*------------- 树形结构测试数据 START CODE --------------*/
List<Object[]> list = new ArrayList<Object[]>();
list.add(new Object[]{"AA1",999,0});
list.add(new Object[]{"AA1_AA2",11,999});
list.add(new Object[]{"AA1_AA1",10,999});
list.add(new Object[]{"AA1_AA1_AA2",1001,10});
list.add(new Object[]{"AA1_AA1_AA1",100,10});
list.add(new Object[]{"AA1_AA1_AA2_AA1",100101,1001});
list.add(new Object[]{"AA1_AA1_AA2_AA2",100102,1001});
list.add(new Object[]{"BB1",2,0});
list.add(new Object[]{"BB1_BB1",20,2});
list.add(new Object[]{"BB1_BB1_BB1",200,20});
list.add(new Object[]{"BB1_BB1_BB2",201,20});
/*------------- 树形结构测试数据 START END --------------*/
StringBuffer sb = new StringBuffer();
//存放符合条件的所有 节点ID
List<Integer> aList = new ArrayList<Integer>();
aList.add(999); //测试查找以 3 作为父节点的所有 子节点列表
//存放在内部循环中所有找到的以指定ID作为父节点的子ID。
List<Integer> tempList = new ArrayList<Integer>();
for(int i=0,count=list.size();i<count; i++){
Object[] arr = list.get(i);
String name = arr[0].toString();
int id = Integer.parseInt(arr[1].toString());
int pid = Integer.parseInt(arr[2].toString());
for(int j=0,len=aList.size(); j<len; j++){
int currid = aList.get(j);
if(id==currid || pid==currid){ //如果数据中 ID或 PID与指定 currid 相同
sb.append(name+"\n");
tempList.add(id); //保存子节点ID到 tempList
}
//如果找到最后一个,并且 tempList 中有子节点的话,把 tempList 赋给 aList
if(j==(len-1) && tempList.size()>0){
aList = tempList;
}
}
}
//打印所有以 3 作为父节点的所有 子节点
System.out.println(sb.toString());
}
执行结果如下:
AA1
AA1_AA2
AA1_AA1
AA1_AA1_AA2
AA1_AA1_AA1
AA1_AA1_AA2_AA1
分享到:
相关推荐
TreeView用递归实现无限级树.rar
不用递归实现的无限级树型菜单,加载速度超快。
递归实现的无限级下拉式菜单 没有资源积分了 发布一个资源,换点分:( 可以先看看演示在决定下载与否吧. http://ahlxjg.qsh.eu/MenuTest.aspx
php递归实现无限级分类库,感兴趣的朋友们可以下载下来,用到自己的项目中。
C# 递归实现无限级分类,里面的例子可以让你在自己的项目中得以方便的应用.值得初学者学习
php递归实现无限级分类库,感兴趣的朋友们可以下载下来,用到自己的项目中。
无限级树正向查找、反向查找例子【递归实现】 无限级树正向查找、反向查找例子【递归实现】 无限级树正向查找、反向查找例子【递归实现】
分别用递归和非递归方法实现二分查找算法 的完整程序,indexof()返回的是循环实现的二分法查找,getindex()实现的是递归算法实现的二分法查找。
快速选择非递归与递归算法实现
C#使用递归算法,生成并画树形状的图形。详细介绍请到博客中看看
Java递归算法构造JSON树形结构,Java递归算法构造JSON树形结构Java递归算法构造JSON树形结构
用递归实现C#树形结构 ,用递归实现C#树形结构 ,
这个是通过vc6.0运行出来的分形树,只是一个分形结构图,参考的是一本书上的代码,一根竹竿生长出两个侧干,实现的递归算法。。
使用C++非递归实现fibonacci数列,对正在学习算法的同学应该挺有帮助的
树形下拉列表 递归实现 包含有 sql server 数据库脚本
快速排序算法设计与分析总结 二叉树与树的转换前序、后序的递归、非递归算法,层次序的非递归算法的实现 二叉树与树的转换前序、后序的递归、非递归算法,层次序的非递归算法的实现,应包含建树的实现 实现树与...
实现树与二叉树的转换的实现。以及树的前序、后序的递归、非递归算法,层次序的非递归算法的实现,应包含建树的实现。
.net 递归算法.net 递归算法.net 递归算法.net 递归算法.net 递归算法.net 递归算法.net 递归算法.net 递归算法
c#实现无限级树菜单实例,使用递归方法,有需要的朋友看看。
C#,阶乘(Factorials)的递归、非递归、斯特林近似及高效算法与源代码 阶乘是基斯顿·卡曼(Christian Kramp,1760~1826)于 1808 年发明的运算符号,是数学术语。 一个正整数的阶乘(factorial)是所有小于及等于...