java 递归 生成树

时间:2021-11-27 12:59:40

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

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

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

那就好办了:

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;
}
}