* 功能1: 部门列表生成树
* 功能2: 设置树的每个节点高度
代码 :
public class TreeDemo {
//测试
public static void main(String[] args) {
long t1 = System.currentTimeMillis();
//模拟初始数据集合
List<TreeNode> list = initData();
//计算树结构
TreeNodeVo tree = getTree(list);
//设置每个节点高度
getHeight(tree);
System.out.println("List耗时:" + (System.currentTimeMillis() - t1));
System.out.println(JSONObject.toJSON(tree));
}
/**
* *****************求树高,最底层默认是1***************
*
* ------- 11-------111
* |
* ------1----|
* | |-------12
* |
* 0---|
* |-----2----|--------21
*
* 例如 节点 111 的高度是1, 11高度是2 , 1 高度是 3
*
* *****************求树高,最底层默认是1***************
*/
private static Integer getHeight(TreeNodeVo tree) {
List<TreeNodeVo> children = tree.getChildren();
if (CollectionUtils.isEmpty(children)) {
return 1;
}
//最大的儿子高度
Integer maxHightSon = 1;
for (TreeNodeVo vo : children) {
int heightOfChildren = getHeight(vo);
vo.setHeight(heightOfChildren);
System.out.println("vo.getName :" + vo.getName());
System.out.println("vo.getHeight :" + vo.getHeight());
maxHightSon = Math.max(heightOfChildren, maxHightSon);
}
tree.setHeight(maxHightSon + 1);
System.out.println("tree.getName :" + tree.getName());
System.out.println("tree.getHeight :" + tree.getHeight());
return maxHightSon + 1;
}
private static TreeNodeVo getTree(List<TreeNode> list) {
int count = 0;
// 2. 根节点
TreeNodeVo root = new TreeNodeVo();
root.setId(-1);
root.setName("根节点");
// 3. 子节点 待下挂队列
LinkedList<TreeNodeVo> tempQueue = new LinkedList<>();
tempQueue.add(root);
while (!tempQueue.isEmpty() && list.size() > 0) {
TreeNodeVo currentNodeVo = tempQueue.poll();
for (int i = list.size() - 1; i >= 0; i--) {
count++;
TreeNode item = list.get(i);
if (item.getParentId() != null && currentNodeVo.getId().equals(item.getParentId())) {
TreeNodeVo child = convert(item);
currentNodeVo.getChildren().add(child);
tempQueue.add(child);
list.remove(item);
}
}
}
System.out.println("循环次数:" + count);
return root;
}
//copy
private static TreeNodeVo convert(TreeNode node) {
TreeNodeVo nodeVo = new TreeNodeVo();
nodeVo.setId(node.getId());
nodeVo.setName(node.getName());
nodeVo.setParentId(node.getParentId());
return nodeVo;
}
//初始化数据
private static List<TreeNode> initData() {
TreeNode node1 = new TreeNode();
node1.setId(1);
node1.setName("水果");
node1.setParentId(-1);
TreeNode node2 = new TreeNode();
node2.setId(2);
node2.setName("蔬菜");
node2.setParentId(-1);
TreeNode node3 = new TreeNode();
node3.setId(3);
node3.setName("苹果");
node3.setParentId(1);
TreeNode node4 = new TreeNode();
node4.setId(4);
node4.setName("梨子");
node4.setParentId(1);
TreeNode node5 = new TreeNode();
node5.setId(5);
node5.setName("生菜");
node5.setParentId(2);
TreeNode node18 = new TreeNode();
node18.setId(18);
node18.setName("生包菜");
node18.setParentId(5);
TreeNode node6 = new TreeNode();
node6.setId(6);
node6.setName("红苹果");
node6.setParentId(3);
TreeNode node7 = new TreeNode();
node7.setId(7);
node7.setName("青梨子");
node7.setParentId(4);
TreeNode node9 = new TreeNode();
node9.setId(9);
node9.setName("熟菜");
node9.setParentId(2);
TreeNode node19 = new TreeNode();
node19.setId(19);
node19.setName("熟包菜");
node19.setParentId(9);
TreeNode node13 = new TreeNode();
node13.setId(13);
node13.setName("肉类");
node13.setParentId(-1);
TreeNode node14 = new TreeNode();
node14.setId(14);
node14.setName("牛肉");
node14.setParentId(13);
TreeNode node15 = new TreeNode();
node15.setId(15);
node15.setName("鸡肉");
node15.setParentId(13);
TreeNode node16 = new TreeNode();
node16.setId(16);
node16.setName("牛腿肉");
node16.setParentId(14);
TreeNode node17 = new TreeNode();
node17.setId(17);
node17.setName("鸡翅");
node17.setParentId(15);
List<TreeNode> list = new LinkedList<>();
list.add(node1);
list.add(node2);
list.add(node3);
list.add(node4);
list.add(node5);
list.add(node6);
list.add(node7);
list.add(node9);
list.add(node13);
list.add(node14);
list.add(node15);
// list.add(node16);
list.add(node17);
list.add(node18);
list.add(node19);
//打乱顺序
Collections.shuffle(list);
return list;
}
@Data
private static class TreeNode {
private Integer id;
private String name;
private Integer parentId;
}
@Data
private static class TreeNodeVo extends TreeNode {
private Integer height;
private List<TreeNodeVo> children = new ArrayList<>();
}
}