java 之树型递归算法

如何来做一棵递归树,这在前面的文章中有提过,但那是引用了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,数据结构,算法)