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;
 }
發佈了253 篇原創文章 · 獲贊 4 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章