前言
- 前段时间遇到的一个需求,前台需要实现一个类似于思维导图的页面,并且就一个页面,项目不是思维导图项目。
- 所以打算以json数据的形式在数据库存储数据【MySql中对json数据的操作支持】
- 后台以多叉树的结构做缓存【因为就用到一个页面,数据较少】
- 前端只提供渲染与数据交互
- 下面贴出实现的小demo
我们实现下面这颗树
![Java多叉树的遍历](https://i-blog.csdnimg.cn/blog_migrate/0ff29a46d4ed6b5231d610b74ea1be28.png)
Show Code?
节点对象
class Node{
private int Id;
private String data;
public List<Node> nodes = new ArrayList<Node>();
public Node(int Id){
this.Id = Id;
}
public Node(int Id,String data){
this.Id = Id;
this.data = data;
}
public int getId() {
return Id;
}
public void setId(int id) {
Id = id;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
多叉树对象
class Tree{
private Node root = new Node(0);
public int identifying = 1;
public int index = 0;
public Node getRoot(){
return this.root;
}
public void add(int parentId,String data){
this.add(parentId,data,this.getRoot().nodes);
}
public void add(int parentId,String data,List<Node> list){
if(parentId==0){
Node newNode = new Node(identifying++,data);
this.root.nodes.add(newNode);
}else {
if(list.size()==0){
return;
}
for(Node item:list){
if(item.getId() == parentId){
Node newNode = new Node(identifying++, data);
item.nodes.add(newNode);
break;
}else {
add(parentId,data,item.nodes);
}
}
}
}
public void list(){
this.list(this.getRoot().nodes);
}
public void list(List<Node> list){
index++;
if(index == identifying){
return;
}
for(Node item:list){
System.out.println(item.getData());
if(item.nodes.size() == 0){
continue;
}else {
list(item.nodes);
}
System.out.println("\t");
}
}
}
测试
测试代码
Tree tree = new Tree();
tree.add(0, "一级树杈1");
tree.add(0, "一级树杈2");
tree.add(0, "一级树杈3");
tree.add(1, "二级树杈1");
tree.add(1, "二级树杈2");
tree.add(2, "二级树杈3");
tree.add(6, "三级树杈1");
tree.add(6, "三级树杈2");
tree.list();
测试效果
- 二级展开图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/26e66bc31cbe94941cd30827d9da78f6.png)
- 打印
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a41bac27f1ea1cefde6f33df20d9f609.png)
- 需要注意的是:我们是对每个节点的路径进行循环打印的。