Java实现对多叉树的操作

前言

  • 前段时间遇到的一个需求,前台需要实现一个类似于思维导图的页面,并且就一个页面,项目不是思维导图项目。
  • 所以打算以json数据的形式在数据库存储数据【MySql中对json数据的操作支持】
  • 后台以多叉树的结构做缓存【因为就用到一个页面,数据较少】
  • 前端只提供渲染与数据交互
  • 下面贴出实现的小demo

我们实现下面这颗树

Java多叉树的遍历

  • 我们约定:添加的节点Id为自增

Show Code?

节点对象

class Node{
    private int Id;    //节点Id
    private String data; //节点数据
    public List<Node> nodes = new ArrayList<Node>(); //多个子节点,利用List实现
    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){	//如果父节点Id为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);
    }
    //循环Tree
    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();

测试效果

  • 二级展开图
    在这里插入图片描述
  • 打印
    在这里插入图片描述
  • 需要注意的是:我们是对每个节点的路径进行循环打印的。

  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值