在公司项目中用递归生成 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
分享到:
相关推荐
"递归实现的无限级下拉式菜单"是一种常见的设计模式,尤其适用于网站导航,它允许用户通过点击主菜单项来展开各级子菜单,从而方便地访问深层次的页面结构。这种设计能够有效地组织大量层次分明的数据,使得用户能...
无限级分类的核心在于通过数据库设计和递归算法来实现。数据库通常会包含两个关键字段:`id`(当前分类的唯一标识)和`pid`(父分类的id)。这样,每个分类都能指向其父分类,形成层级关系。例如,一个服装分类可能...
PHP实现递归无限级分类主要涉及递归算法在处理数据库中分类数据的应用。在现实中的应用场景,如电子商务网站商品分类、内容管理系统中的栏目分类等,都需要使用到无限级分类功能。无限级分类意味着每个分类下可以...
总的来说,不使用递归的无限级分类实现主要依赖于循环和数据结构的理解。通过合理设计数据模型和迭代算法,可以有效地处理和展示任意深度的分类结构。这种方法不仅提高了程序的性能,还避免了递归带来的潜在问题。在...
- **无限级菜单**:如果是在Web开发中,可能涉及到如何生成无限级下拉菜单或者导航栏的代码。 - **遍历算法**:可能包含了一种或多种遍历无限级分类的方法,如深度优先搜索(DFS)或广度优先搜索(BFS)。 对于...
在ASP中实现无限级联动菜单,通常涉及到数据库操作、递归算法以及JavaScript或jQuery的前端交互技术。 首先,无限级联动菜单是Web开发中常见的功能,它允许用户逐级选择或者浏览层次结构的数据,如目录、分类或层级...
- **递归**:在无限级分类中,递归算法是关键,它用于遍历和构建层级结构。递归函数会调用自身来处理每个子节点,直到所有节点都被处理。 - **树形结构**:分类数据通常以树形结构存储,每个节点代表一个分类,...
在ASP中实现这一功能通常涉及递归算法和数据库设计。数据库设计通常会有一个类别表,包含字段如“ID”(唯一标识符)、“Name”(类别名称)、“ParentID”(父类别的ID),通过ParentID来确定类别之间的父子关系。 ...
总之,实现JavaScript的无限级可排序下拉框涉及数据结构设计、遍历算法(迭代和递归)、DOM操作、事件监听、排序算法以及交互设计等多个方面。通过理解这些知识点,开发者可以创建出高效、易用的前端组件。
5. 用户界面展示:根据分类树,可以生成层级的下拉菜单、面包屑导航等用户界面元素,方便用户浏览和选择。 最后,对于PHP开发者来说,掌握数组操作、排序算法、遍历算法、数据结构和算法、正则表达式、运算符使用、...
动态二级树形产品导航菜单的核心在于递归算法的实现。在ASP中,通常会定义一个函数,该函数根据父类别ID查询数据库,获取子类别,然后在HTML中逐层展开。每次递归调用都是为当前类别添加子项,直到没有子项为止。...
学习这个源码可以帮助开发者理解如何在ASP.NET环境中处理无限级分类,掌握递归算法的应用,以及如何与数据库进行交互,同时也能提升前后端交互和用户体验设计的能力。对于初学者来说,这是一个很好的实践项目,而...
通过递归查询或者层次遍历算法(如预排序遍历树,前序遍历)可以获取任意层级的分类。这种设计模式使得在后台管理界面可以方便地添加、编辑和删除分类,同时在前端展示时也能灵活地进行无限级下拉或折叠效果。 源码...
这个压缩包文件"简单无限级分类(表格、下拉列表)源码_unlimitedclass.zip"提供了实现这种分类方式的代码示例,对于开发者来说,这是一个非常实用的资源。下面将详细介绍这个源码可能涉及的关键知识点。 1. **无限级...
3. **递归绑定**:在处理无限级分类时,递归是核心算法。递归是一种函数或过程调用自身的技术,常用于解决层次结构问题。在无限级分类绑定中,递归函数会遍历每个类别并添加到`DropDownList`,同时处理其所有子类别...
五、无限级下拉菜单实现 在Web开发中,无限级树结构常用于实现下拉菜单。通过遍历树结构,可以生成HTML代码,如`<ul>`和`<li>`元素,实现层次结构的菜单。 六、优化与性能 1. 自平衡树:如AVL树、红黑树等,能...
无限级分类可以通过递归算法实现,例如自关联查询,在数据库层面则可能使用自引用表来存储。 接下来,"表格分类"是指将无限级分类以表格的形式展示,通常用于后台管理系统,便于管理员查看和管理。表格分类可能包含...
DropDownList无限级分类是一种在网页或应用程序中实现的交互元素,它允许用户从一系列下拉选项中选择一个值。在许多场景中,这些选项可能需要按照层级结构组织,例如国家/地区、部门、职位等,形成一个无限级别的树...
接下来,我们将详细阐述实现无限级分类所需要的数据库设计、递归算法的实现逻辑以及在***中如何操作数据库来获取和展示数据。 1. 数据库设计: 在进行无限级分类功能的开发之前,首先要设计一个合适的数据库结构。...