java 递归 生成树

原创 2018年01月11日 16:48:46

此方法可以将表中的所有树全部生成

先说好,写得不好别怪我,不过树还是可以生成的。

我的想法是,数据库中存的不一定是一棵树,也就是说最顶级的父节点不止一个。

那就好办了:

1 先读取数据库中的所有数据存放到treeNodeList中。

2 然后遍历list,将其中的最顶级的父节点存到另一个list ---fatherList中

3 然后遍历fatherList,根据其中的节点,生成对应的树,fatherList中有几个节点,就有几棵树。

4 把第三步生成的树添加到这个list中  List<TreeNode> allTree

我把它写成utils,类名是Treeutils。使用方式:

  Treeutils maketree = new Treeutils(service.GetTreeData());
  List<TreeNode> tree = maketree.getTree();

service.GetTreeData();这个方法是你从数据库取到的数据,返回值是List<T>

具体步骤见代码

import java.util.ArrayList;
import java.util.List;
import com.cn.model.TreeNode;
public class Treeutils {
private List<TreeNode> treeNodeList = new ArrayList<TreeNode>();
public Treeutils(List<TreeNode> list) {
treeNodeList = list;
}
/**
* 得到所有树
* @return list(存放所有的树-)
*/
public List<TreeNode> getTree()
{
return makeTreeList(getFatherNode());
}
   /**
    * @return 存放父节点的list:fatherList
    */
public List<TreeNode> getFatherNode() {
int i, j, sum = 0;
int size = treeNodeList.size();
List<TreeNode> fatherList = new ArrayList<TreeNode>();
for (i = 0; i < size; i++) {
for (j = 0; j < size; j++) {
if (!treeNodeList.get(i).getFid().equals(treeNodeList.get(j).getId())) {
sum++;
} else {
break;
}
}
if (sum == size) {
treeNodeList.get(i).setState("closed");
fatherList.add(treeNodeList.get(i));
sum = 0;
} else {
sum = 0;
}
}
return fatherList;
}
/**遍历fatherlist中的父节点
* 调用maketree()方法根据每个父节点产生相应的树
* 并将产生的树放到list中
* @param fatherlist
* @return allTree(存放的都是树)
*/
public List<TreeNode> makeTreeList(List<TreeNode> fatherlist)
{
List<TreeNode> allTree =new ArrayList<TreeNode>();
for(TreeNode item:fatherlist)
{
allTree.add(makeTree(item));
}
  return allTree;
}
/**根据传进来的树制作一颗树
* 递归生成一棵树
* @param Node
* @return
*/
public TreeNode makeTree(TreeNode Node)
{
TreeNode root = Node;
    List<TreeNode> childrenTreeNode = this.getChildrenNodeById(Node.getId());
    for(TreeNode item:childrenTreeNode)
    {
    TreeNode node = makeTree(item);
    root.getChildren().add(node);
    }
   return root;
}
/**
* @param nodeId(父节点对应的id)
* @return 获得所有子节点,并存放在childrenTreeNode中
*/
public List<TreeNode> getChildrenNodeById(String nodeId) {
List<TreeNode> childrenTreeNode = new ArrayList<TreeNode>();
for (TreeNode item : treeNodeList) {
if (item.getFid().equals(nodeId)) {
childrenTreeNode.add(item);
}
}
return childrenTreeNode;
}
}


java从数据库读取菜单,递归生成菜单树

java从数据库读取菜单,递归生成菜单树
  • frankcheng5143
  • frankcheng5143
  • 2016年10月29日 13:44
  • 22967

java递归实例(一)---递归构造Tree结构

java递归实例
  • yansong_8686
  • yansong_8686
  • 2015年12月20日 00:54
  • 5036

Java实现通过递归遍历树形结构

树形结构在数据库的设计过程中是一种比较常见的模型,指的是各元素之间存在‘一对多’的结构模型。在树形结构中,树根结点没有前驱结点,其余每个结点有且只有一个前驱结点。叶子结点没有后续结点,其余每个结点的后...
  • memories5977
  • memories5977
  • 2015年11月04日 22:42
  • 11697

java 递归查询组织机构树

java 递归查询组织机构树
  • JavaAlpha
  • JavaAlpha
  • 2017年03月21日 11:31
  • 5706

java 递归得到部门树

Java代码   public DepartmentUserTreeNode getTree(String location,String  name) {          List de...
  • csdnxingyuntian
  • csdnxingyuntian
  • 2017年04月26日 21:28
  • 3390

[Java]递归画树

package cn.test.javase; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphic...
  • BrilliantCoder
  • BrilliantCoder
  • 2017年10月10日 08:36
  • 590

java 递归取树结构数据

/** * 递归取树结构数据 * @param role_id * @param press_id * @param parentid * @return * @project_Name securi...
  • lg12lp12
  • lg12lp12
  • 2016年12月08日 15:30
  • 606

Java递归应用:输出树形菜单

树节点类:package cn.com.tree; public class Node { private Integer id; private Integer parentId; priv...
  • zhangzeyuaaa
  • zhangzeyuaaa
  • 2014年04月27日 09:40
  • 34728

用Java集合递归实现通用树Tree

  • 2010年11月28日 03:27
  • 715KB
  • 下载

java 递归遍历树形结构

//菜单树形结构 public JSONArray treeMenuList(JSONArray menuList, int parentId) { JSONArray chi...
  • h70614959
  • h70614959
  • 2014年05月04日 18:19
  • 48043
收藏助手
不良信息举报
您举报文章:java 递归 生成树
举报原因:
原因补充:

(最多只允许输入30个字)