通過根結點到葉結點的路徑還原多叉樹

工作的時候遇到根據根結點到葉結點的路徑還原多叉樹的問題,下面是我的源代碼,不知道你們有沒有好的方法,歡迎評論指正。

由以下三個路徑:

路徑深度可以自定義,本文路徑深度爲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>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章