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 String path = "/a/b/c/d"; ``` 我们希望将其转换为如下的树型结构: ``` a └── b └── c └── d ``` 可以使用以下的代码实现: ```java import java.util.ArrayList; import java.util.List; public class TreeGenerator { public static void main(String[] args) { String path = "/a/b/c/d"; Node rootNode = generateTree(path); System.out.println(rootNode.toString()); } public static Node generateTree(String path) { String[] pathArray = path.split("/"); Node rootNode = new Node(pathArray[1]); Node currentNode = rootNode; for (int i = 2; i < pathArray.length; i++) { Node childNode = new Node(pathArray[i]); currentNode.addChild(childNode); currentNode = childNode; } return rootNode; } static class Node { private String name; private List<Node> children = new ArrayList<>(); public Node(String name) { this.name = name; } public void addChild(Node child) { children.add(child); } @Override public String toString() { return toString(0); } private String toString(int level) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < level; i++) { sb.append(" "); } sb.append(name).append("\n"); for (Node child : children) { sb.append(child.toString(level + 1)); } return sb.toString(); } } } ``` 该代码会输出以下内容: ``` a b c d ``` 其中,`Node` 类表示树中的节点,`generateTree` 方法用于将路径字符串转化为树型结构,`toString` 方法用于将树型结构转化为字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值