通过根结点到叶结点的路径还原多叉树

工作的时候遇到根据根结点到叶结点的路径还原多叉树的问题,下面是我的源代码,不知道你们有没有好的方法,欢迎评论指正。

由以下三个路径:

路径深度可以自定义,本文路径深度为4

还原成如下多叉树,


import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.Setter;

import java.util.*;

/**
 * @Author: RichurLiu
 * @Date: 2019/7/19
 */
public class ListMain {

    public static void main(String[] args) {
        Node root = new Node(0L,"", (short) 0, new ArrayList<>());

        PositionListVO pl1 = new PositionListVO(11L,21L,31L,41L);
        PositionListVO pl2 = new PositionListVO(12L,21L,32L,42L);
        PositionListVO pl3 = new PositionListVO(11L,22L,33L,43L);

        PositionListBaseVO plb01 = new PositionListBaseVO(11L,(short)1,"11L");
        PositionListBaseVO plb02 = new PositionListBaseVO(12L,(short)1,"12L");
        PositionListBaseVO plb03 = new PositionListBaseVO(21L,(short)2,"21L");
        PositionListBaseVO plb04 = new PositionListBaseVO(22L,(short)2,"22L");
        PositionListBaseVO plb05 = new PositionListBaseVO(31L,(short)3,"31L");
        PositionListBaseVO plb06 = new PositionListBaseVO(32L,(short)3,"32L");
        PositionListBaseVO plb07 = new PositionListBaseVO(33L,(short)3,"33L");
        PositionListBaseVO plb08 = new PositionListBaseVO(41L,(short)4,"41L");
        PositionListBaseVO plb09 = new PositionListBaseVO(42L,(short)4,"42L");
        PositionListBaseVO plb10 = new PositionListBaseVO(43L,(short)4,"43L");

        //1将所有路径加载到list中
        List<PositionListVO> positionList = new ArrayList<>();
        positionList.add(pl1);
        positionList.add(pl2);
        positionList.add(pl3);
        //2将所有基础数据加载到map中
        map.put(plb01.getId(),plb01);
        map.put(plb02.getId(),plb02);
        map.put(plb03.getId(),plb03);
        map.put(plb04.getId(),plb04);
        map.put(plb05.getId(),plb05);
        map.put(plb06.getId(),plb06);
        map.put(plb07.getId(),plb07);
        map.put(plb08.getId(),plb08);
        map.put(plb09.getId(),plb09);
        map.put(plb10.getId(),plb10);
        //List<PositionListBaseVO> positionListBase = new ArrayList<>();
        for (PositionListVO listVO : positionList) {
            Node parent = root;
            parent = insertNode(initNode(listVO.getListId()), parent.getSonList());
            if(null == parent.getSonList()){
                parent.setSonList(new ArrayList<>());
            }
            parent = insertNode(initNode(listVO.getChildListId()), parent.getSonList());
            if(null == parent.getSonList()){
                parent.setSonList(new ArrayList<>());
            }
            parent = insertNode(initNode(listVO.getFunctionId()), parent.getSonList());
            if(null == parent.getSonList()){
                parent.setSonList(new ArrayList<>());
            }
            insertNode(initNode(listVO.getStandardId()), parent.getSonList());

        }
        List<Node> sonList = root.getSonList();
        System.out.println(JSON.toJSONString(sonList));
    }

    static Map<Long,PositionListBaseVO> map = new HashMap<>();


    /**
     * 初始化结点信息
     * @param id
     * @return
     */
    private static Node initNode(long id){
        Node n = new Node();
        PositionListBaseVO vo = map.get(id);
        if(null == vo){
            //抛异常
            return n;
        }
        n.setId(vo.getId());
        n.setType(vo.getType());
        n.setName(vo.getName());
        return n;
    }

    /**
     * 如果树中无此结点,向树中插入一个结点
     * @param node
     * @param sonList
     * @return
     */
    private static Node insertNode(Node node, List<Node> sonList){
        boolean flag = false;
        for (Node n : sonList) {
            if(n.getId().equals(node.getId())){
                flag = true;
                node = n;
                break;
            }
        }
        //树中不存在则添加
        if(!flag){
            sonList.add(node);
        }
        return node;
    }
}

结点:

@Getter
@Setter
class Node {
    private Long id;          //结点id
    private String name;        //结点名称
    private Short type;
    private List<Node> sonList; //该结点的 子结点集合

    Node(){}
    Node(Long id, String name, Short type, List<Node> sonList) {
        this.id = id;
        this.name = name;
        this.type = type;
        this.sonList = sonList;
    }
}

基础类:

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

/**
 * @Author: RichurLiu
 * @Date: 2019/7/21
 */
@Setter
@Getter
@AllArgsConstructor
public class PositionListBaseVO {
    private Long id;
    private Short type;
    private String name;
    PositionListBaseVO(){}
}
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

/**
 * @Author: RichurLiu
 * @Date: 2019/7/21
 */
@Setter
@Getter
@AllArgsConstructor
public class PositionListVO {
    private Long listId;
    private Long childListId;
    private Long functionId;
    private Long standardId;
    PositionListVO(){}
}

会用到两个jar包:

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.2</version>
            <scope>compile</scope>
        </dependency>

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值