package tree;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.collections.CollectionUtils;
public class TreeBuilder {
/**
* 将集合建立成树结构
*
* @param dirs
* @return
*/
@SuppressWarnings("unchecked")
private List<Node> buildListToTree(List<Node> dirs) {
List<Node> roots = findRoots(dirs);
List<Node> notRoots = (List<Node>) CollectionUtils.subtract(dirs, roots);
for (Node root : roots) {
root.setChildren(findChildren(root, notRoots));
}
return roots;
}
/**
* 找出集合中的根元素
*
* @param allDirs
* @return
*/
public List<Node> findRoots(List<Node> allNodes) {
List<Node> results = new ArrayList<Node>();
for (Node node : allNodes) {
boolean isRoot = true;
for (Node comparedOne : allNodes) {
if (node.getParentId() == comparedOne.getId()) {
isRoot = false;
break;
}
}
if (isRoot) {
node.setLevel(0);
results.add(node);
node.setRootId(node.getId());
}
}
return results;
}
/**
* 递归找子目录
*
* @param root
* @param allDirs
* @return
*/
@SuppressWarnings("unchecked")
private List<Node> findChildren(Node root, List<Node> allNodes) {
List<Node> children = new ArrayList<Node>();
for (Node comparedOne : allNodes) {
if (comparedOne.getParentId() == root.getId()) {
comparedOne.setParent(root);
comparedOne.setLevel(root.getLevel() + 1);
children.add(comparedOne);
}
}
List<Node> notChildren = (List<Node>) CollectionUtils.subtract(allNodes, children);
for (Node child : children) {
List<Node> tmpChildren = findChildren(child, notChildren);
if (tmpChildren == null || tmpChildren.size() < 1) {
child.setLeaf(true);
} else {
child.setLeaf(false);
}
child.setChildren(tmpChildren);
}
return children;
}
public static void main(String[] args) {
TreeBuilder tb = new TreeBuilder();
List<Node> allNodes = new ArrayList<Node>();
allNodes.add(new Node(1,0,"节点1"));
allNodes.add(new Node(2,0,"节点2"));
allNodes.add(new Node(3,0,"节点3"));
allNodes.add(new Node(4,1,"节点4"));
allNodes.add(new Node(5,1,"节点5"));
allNodes.add(new Node(6,1,"节点6"));
allNodes.add(new Node(7,4,"节点7"));
allNodes.add(new Node(8,4,"节点8"));
allNodes.add(new Node(9,5,"节点9"));
allNodes.add(new Node(10,100,"节点10"));
List<Node> roots = tb.buildListToTree(allNodes);
for(Node n:roots){
System.out.println(n);
}
}
}
package tree;
import java.util.List;
public class Node implements java.io.Serializable {
private static final long serialVersionUID = -2721191232926604726L;
private int id;
private int parentId;
private Node parent;
private List<Node> children;
private String name;
private int level;
private int sort;
private int rootId;
private String type;
private boolean isLeaf;
private String description;
public Node() {
super();
}
public Node(int id, int parentId, String name) {
super();
this.id = id;
this.parentId = parentId;
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Node getParent() {
return parent;
}
public void setParent(Node parent) {
this.parent = parent;
}
public int getParentId() {
return parentId;
}
public void setParentId(int parentId) {
this.parentId = parentId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public String getType() {
return type;
}
public List<Node> getChildren() {
return children;
}
public void setChildren(List<Node> children) {
this.children = children;
}
public void setType(String type) {
this.type = type;
}
public boolean isLeaf() {
return isLeaf;
}
public void setLeaf(boolean isLeaf) {
this.isLeaf = isLeaf;
}
public int getSort() {
return sort;
}
public void setSort(int sort) {
this.sort = sort;
}
public int getRootId() {
return rootId;
}
public void setRootId(int rootId) {
this.rootId = rootId;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result + parentId;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Node other = (Node) obj;
if (id != other.id)
return false;
if (parentId != other.parentId)
return false;
return true;
}
@Override
public String toString() {
return "Node {id=" + id + ", parentId=" + parentId
+ ", children=" + children + ", name=" + name + "}";
}
}
分享到:
相关推荐
/** * 功能:把一个数组的值存入二叉树中,然后进行3种方式的遍历 * * 参考资料0:数据结构(C语言版)严蔚敏
k-d树 (k-dimensional树的简称),是一种分割k维数据空间的数据结构。主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索)。K-D树是二进制空间分割树的特殊的情况。
java实现的jsp动态树形菜单功能 简单的一个例子 代码全面 功能完善
部门组织显示开发,从jsp到后台java都有详细解析,同时提供有相关的js。开发内容简单,适合初学者和忘记部门树开发者。
排序二叉树的基础代码,包含递归非递归二叉树构建、递归非递归遍历,获取最小最大值。
java构造多级树结构,支持多根节点. 运行main即可看到效果
哈夫曼编码、哈夫曼树构建、哈夫曼树Java实现.docx哈夫曼编码、哈夫曼树构建、哈夫曼树Java实现.docx
选中左边的树中的节点,右边自动构建一棵树,并显示选中的节点,右边的树节点也可以动态的删除。
一个简单的小例子递归实现list按照index排序的树
java模拟编译器,实现词法,语法分析,生成语法树
使用java语言,ID3算法构建决策树,具有很好的分类效果
java实现的决策树算法(ID3),里面附带测试数据集,包含输出构建的决策树,测试正确率,对数据进行预测
构建故障树,进行分析绘图,并得出最小割集
新概念智能树形菜单--利用加权多叉树结合
利用Java语言实现kd树。利用快速排序找到每一维度的中位数构建Kd树。搜索Kd树时候利用K大堆维护K个最近邻的点。
此java类实现了对数据表的分类递归树的实现,为本人倾力之作,后期,会发布js版,敬请期待!
构建定制的树型视图
NULL 博文链接:https://yuhuiblog695685688425687986842568269.iteye.com/blog/2322287
主要介绍了Java递归遍历树形结构的相关资料,需要的朋友可以参考下
Java编程实战:手把手教你构建树.