`
fangbiao23
  • 浏览: 41887 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java 之树型递归算法

    博客分类:
  • jsf
阅读更多

如何来做一棵递归树,这在前面的文章中有提过,但那是引用了myfaces组件的,今天就不用啥组件了,直接输出树的结构形状.

数据库表数据一样,但还是在此重复一次。

我们的目标是:完成以下形态的树状.

--管理

---高级管理员

----增加

----删除

----修改

---普通管理员

----增加

 

 

 

一、建表

/**
--树形菜单
   节点编号
   节点名称
   节点链接址
   些节点父节点
   是否最底节点
    节点排序(一般用在同级节点上)
   节点说明 
*/

 

drop table EPTreeTable

create table EPTreeTable
(
  TreeNodeId int identity(1,1) constraint pk_TreeNode primary key,
  TreeNodeName varchar(50) not null,
  TreeNodeLink varchar(100) ,
  TreeNodeFatherId int default 0, --0 为最高层
  TreeNodeIsBottom bit default 1, --1 为底层 0为非底层
  TreeNodeCompositor int default 1, -- 默认排在最后面
  TreeNodeExplain varchar(200)
)

 

 

二、JAVA代码

(1)TO对象

 

/**
 * @author fangbiao
 * 用于映射父级菜单TO对象
 */
public class ParentResourcePojo {
 /**
  * 节点编号
  */
 private int  treeNodeId;
 /**
  * 节点名称
  */
 private String  treeNodeName;
 /**
  * 父节点
  */
 private int  treeParentNodeId;
 /**
  * @return treeNodeName
  */
 public String getTreeNodeName() {
  return treeNodeName;
 }
 /**
  * @param treeNodeName 要设置的 treeNodeName
  */
 public void setTreeNodeName(String treeNodeName) {
  this.treeNodeName = treeNodeName;
 }
 /**
  * @return treeParentNodeId
  */
 public int getTreeParentNodeId() {
  return treeParentNodeId;
 }
 /**
  * @param treeParentNodeId 要设置的 treeParentNodeId
  */
 public void setTreeParentNodeId(int treeParentNodeId) {
  this.treeParentNodeId = treeParentNodeId;
 }
 /**
  * @return treeNodeId
  */
 public int getTreeNodeId() {
  return treeNodeId;
 }
 /**
  * @param treeNodeId 要设置的 treeNodeId
  */
 public void setTreeNodeId(int treeNodeId) {
  this.treeNodeId = treeNodeId;
 }
}

 

(2)树形组合


 /**
  * 获取节点选择列表信息
  * @return
  */
 public List getResourceList(){
  if(resourceList.size() == 0) {
   //获取高级的父节点
   resourceList = doTurnParentToTree(itbs.getTopParentResource());
  }
  return resourceList;
 }


 private int num =2;
 private int tempTotalChildren ;
 private boolean temp = false;
 private int tempParent; //每次递归节点的父节点
 /**
  * 对父级列表进行树排
  * @param prp
  * @return
  */
 private synchronized List doTurnParentToTree(ParentResourcePojo prp){
  if(prp == null)
   return null;
  List list = getChildrenList(prp);
     
  //分线
  tempParent = prp.getTreeParentNodeId();
  
  String str = "";
  if(tempParent == 0){
   resourceList.add("-"+prp.getTreeNodeName()));
  }else{
   resourceList.add(prp.getTreeNodeName()));

//每棵树的节点数目
   tempTotalChildren = list.size();
   
  }
  Iterator iterator = list.iterator();
  while(iterator.hasNext()){

   ParentResourcePojo treePojo = (ParentResourcePojo)iterator.next();


   if(tempParent != 0){
    if( tempParent < treePojo.getTreeParentNodeId()){
     if(temp == false)
      num += 1; 
    }else if( tempParent > treePojo.getTreeParentNodeId()){
     num -=1;
     temp = false;
    }else if( tempParent == treePojo.getTreeParentNodeId() ){
     if(tempTotalChildren ==0)
      temp = false;
     else
      temp = true;
    }
   
   }
   for(int i=0;i<num;i++){
    str = str + "-";
   }
   
   treePojo.setTreeNodeName(CommonUtil.doAddAppendString(str,treePojo.getTreeNodeName()));
   str = "";
     doTurnParentToTree(treePojo);
   
   
  } 
  return resourceList;
 }
 /**
  * 父级菜单列表
  */
 private List allParentTreeList = null;
   /**
    * 做标记用
    */
 private int flag = 0;
 /**
  * 获取所有父级菜单列表树
  * @return
  */
 private List getAllParentTreeList(){
  if(allParentTreeList == null){
   if(flag == 0){
    flag = 1;
    allParentTreeList =  itbs.getRRCResource();
    return allParentTreeList;
   }
   return allParentTreeList;
  }
  return allParentTreeList;
 }
 /**
  * 取子树列
  * @param prp
  * @return
  */
 private List getChildrenList(ParentResourcePojo prp){
  List list = getAllParentTreeList();
  int listLength = list.size();
  List newReturnList = new ArrayList();
  if(listLength == 0)
   return newReturnList;

List leaveList = new ArrayList();
  for(int i=0;i<listLength;i++){
   ParentResourcePojo prPojo =  (ParentResourcePojo)list.get(i);
   int treePojoTreeParantNodeId = prPojo.getTreeParentNodeId();
   int tpTreeNodeId = prp.getTreeNodeId();
   if(treePojoTreeParantNodeId == tpTreeNodeId){
    newReturnList.add(prPojo);
   }else{
    leaveList.add(prPojo);
   }
  }
  list = leaveList;
  return newReturnList;
 }
 

 

到此完成,期间一定要注重同级节点的排序。

分享到:
评论

相关推荐

    java递归树型结构通用数据库

    在Java递归树型结构通用数据库中,使用递归算法来实现部门信息的查询和删除操作,该算法可以递归查询部门信息,实现树型结构的部门管理。 7. 部门树型结构展示 在Java递归树型结构通用数据库中,提供了部门树型...

    树的遍历前序后序递归算法、层序非递归算法

    本节将详细介绍树的前序、后序递归算法以及层序非递归算法,并探讨如何在Java中实现这些算法。 首先,我们要理解树的基本概念。树由若干个节点组成,每个节点可以有零个或多个子节点。在树的遍历过程中,我们需要...

    java 树型菜单建立

    在Java编程中,树型菜单是一种常见的用户界面元素,它以层次结构展示数据,便于用户进行导航和操作。本文将详细讲解如何使用Java来构建一个动态的、可交互的树型菜单,包括从数据库获取数据、创建树节点、实现添加和...

    不用递归实现的无限级树型菜单

    传统的实现方式通常使用递归算法,但这种方法可能会导致内存消耗过大,尤其是在菜单层级很深的情况下。本主题介绍了一种不依赖递归的高效方法来创建无限级树型菜单,具有快速加载的特点。 首先,我们来看`WriteXML....

    java写的递归建树型结构

    在给定的标题“java写的递归建树型结构”和描述“java写的从数据库中提取数据,用变量创建树型结构”中,我们可以深入探讨以下几个关键知识点: 1. **树型结构**:树是一种非线性数据结构,由节点(或顶点)和边...

    java生成树型结构

    在Java编程中,生成树型结构是一项常见的任务,特别是在数据结构和算法的实现中。树是一种非线性数据结构,由节点(或称为顶点)和边构成,每个节点可以有零个或多个子节点。这里我们将深入探讨如何在Java中创建和...

    web中用静态树和递归算法制作动态树

    本文将探讨如何使用JSP、JavaScript(JS)和POJO(Plain Old Java Object)技术,结合递归算法,将静态树转换为动态树。 首先,我们需要一个存储节点信息的数据库。例如,我们可以创建一个包含ID、PID(Parent ID)...

    Java数据结构和算法

    《Java数据结构和算法》第二版中文版是一本深度探讨如何在Java编程环境中应用数据结构和算法的权威著作。本书旨在帮助读者理解并熟练掌握这些关键概念,以便在实际开发中提升程序性能和效率。数据结构是组织和存储...

    Java数据结构和算法.(第二版) applet程序

    《Java数据结构和算法》第二版是一本深入探讨如何在Java编程环境中实现和应用数据结构与算法的权威著作。本书的重点在于理解数据结构的核心概念,以及如何利用这些概念设计和优化算法,从而提升软件的效率和性能。...

    jpa单表递归树形结构实现

    实现递归查询通常需要使用递归算法,但SQL不直接支持。我们可以使用存储过程或者在Java代码中处理。例如,可以使用`findAllByOrderByParentIdAsc()`获取所有节点,然后在内存中遍历和构造树形结构。 最后,业务逻辑...

    二叉树遍历算法 (递归的、非递归的中序、前序、后序遍历 和 层次遍历 以及 求二叉树的宽度和深度)

    对于二叉树的操作,遍历是最基础且核心的功能之一。通过不同的遍历方式,我们可以从多个角度理解二叉树的结构,这对于解决许多与树相关的算法问题至关重要。 #### 二、二叉树遍历的基本概念 遍历是指按照一定的顺序...

    数据挖掘18大算法实现以及其他相关经典DM算法

    CBA算法是一种集成挖掘算法,因为他是建立在关联规则挖掘算法之上的,在已有的关联规则理论前提下,做分类判断,只是在算法的开始时对数据做处理,变成类似于事务的形式。详细介绍链接 RoughSets 粗糙集算法。粗糙...

    java源码包---java 源码 大量 实例

     [MonthMaker.java] 月份表算法类  [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP ...

    根据父节点找所有子节点数据.zip

    总的来说,这个Java工具类提供了高效且灵活的手段,帮助开发者在树型数据结构中根据父节点快速获取所有子节点的数据。它体现了递归在解决复杂问题时的强大能力,以及Java面向对象编程的灵活性。在实际项目中,这样的...

    javascript生成树型结构

    对于Java标签,虽然标题中提到的是JavaScript,但如果你想在Java环境中生成树型结构,原理也是类似的。你可以使用类和对象来表示节点,然后通过递归或迭代方法构建树。例如,你可以创建一个`Node`类,包含数据和子...

    Java实现生成Excel树形表头完整代码示例

    Java实现生成Excel树形表头完整代码示例 Java实现生成Excel树形表头完整代码示例是指使用Java语言编写程序来...该示例中的知识点包括树形表头的概念、SplitCell和MergedCell类的设计、递归算法的使用、POI库的应用等。

    数据结构与算法分析(Java版)

    ### 数据结构与算法分析(Java版) #### 书籍概述 《数据结构与算法分析(Java版)》由Robert Lafore撰写,是一本深入浅出介绍数据结构与算法的经典著作。本书通过丰富的图表和实例,帮助读者理解并掌握如何在实际...

    JAVA后台转换成树结构数据返回给前端的实现方法

    我们可以定义一个DTO(Data Transfer Object)来存储树形结构的数据,然后使用递归算法来将数据转换成树形结构。 在上面的示例代码中,我们定义了一个ProjectBasicInfoDTO来存储树形结构的数据。这个DTO包含了id、...

Global site tag (gtag.js) - Google Analytics