`
fangbiao23
  • 浏览: 41291 次
  • 性别: 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;
 }
 

 

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

分享到:
评论

相关推荐

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

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

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

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

    JAVA上百实例源码以及开源项目源代码

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

    JAVA上百实例源码以及开源项目

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

    java源码包4

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

    java源码包3

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

    java源码包2

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

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    日历表格面板 [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    日历表格面板 [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接...

    快速创建树的方法 (抛弃拙劣的数据库结构和算法)

    1、现在很多人都使用“父—子结构+递归算法”来显示树型的层次结构,但是不得不说这是一种非常拙劣的方式,下面给大家一种简单方便的数据结构和算法,快速显示树型的层次结构:2、数据库结构例如表“国家”可以是...

    数据结构二叉树实验报告

    二叉树是一种树型结构,它的特点是每个结点之多只有两棵子树,并且,二叉树的子树有左右之分,其次序不能任意颠倒。回顾二叉树的递归定义可知,二叉树是由3个基本单元组成:根结点、左子树和右子树。因此,若能依次...

    易语言程序免安装版下载

    易语言5.1 相对于易语言5.0更新说明:  支持静态链接其它编程语言(如C/C++、汇编等)编译生成的静态库(.LIB或.OBJ),但仅限于COFF格式,支持cdecl和stdcall两种函数调用约定。  使用说明如下:函数声明和调用...

Global site tag (gtag.js) - Google Analytics