| New file |
| | |
| | | package cc.mrbird.febs.common.tree; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | import java.util.ArrayDeque; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * |
| | | * |
| | | * @author wzy |
| | | * @date 2023-04-18 |
| | | **/ |
| | | @Slf4j |
| | | public class MatrixTree { |
| | | |
| | | private static final MatrixTree MATRIX_TREE = new MatrixTree(); |
| | | public static MatrixTree getInstance() { |
| | | return MATRIX_TREE; |
| | | } |
| | | |
| | | private int childNodeCnt = 3; |
| | | |
| | | // 节点数量 |
| | | private int count = 0; |
| | | private MemberNode root; |
| | | |
| | | private MatrixTree() { |
| | | count = 1; |
| | | } |
| | | |
| | | /** |
| | | * @param node 待添加的节点 |
| | | * @return 返回父节点 |
| | | */ |
| | | public MemberNode addNode(MemberNode node) { |
| | | if (root == null) { |
| | | root = node; |
| | | return null; |
| | | } |
| | | |
| | | MemberNode parentNode = findNotWholeNode(); |
| | | parentNode.addNode(node); |
| | | return parentNode; |
| | | } |
| | | |
| | | /** |
| | | * 层级遍历,查到子节点未满3个的节点 |
| | | * @return |
| | | */ |
| | | public MemberNode findNotWholeNode() { |
| | | ArrayDeque<MemberNode> deque = new ArrayDeque<>(); |
| | | deque.add(root); |
| | | |
| | | MemberNode result = null; |
| | | while(!deque.isEmpty()) { |
| | | int num = deque.size(); |
| | | |
| | | for (int i = 0; i < num; i++) { |
| | | MemberNode memberNode = deque.removeFirst(); |
| | | if (memberNode.CHILD.size() < childNodeCnt) { |
| | | result = memberNode; |
| | | break; |
| | | } |
| | | |
| | | for (MemberNode node : memberNode.CHILD) { |
| | | deque.addLast(node); |
| | | } |
| | | } |
| | | |
| | | if (result != null) { |
| | | break; |
| | | } |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * 查找整个树下对应节点 |
| | | * @param param memberId/address/inviteId |
| | | * @return |
| | | */ |
| | | public MemberNode getNode(Object param) { |
| | | if (root == null) { |
| | | return null; |
| | | } |
| | | |
| | | return getNode(root.CHILD, param); |
| | | } |
| | | |
| | | /** |
| | | * 查找某节点下的对应节点 |
| | | * |
| | | * @param nodeList 某节点 |
| | | * @param param memberId/address/inviteId |
| | | * @return |
| | | */ |
| | | public MemberNode getNode(List<MemberNode> nodeList, Object param) { |
| | | if (CollUtil.isEmpty(nodeList)) { |
| | | return null; |
| | | } |
| | | |
| | | for (MemberNode node : nodeList) { |
| | | if (node.getMemberId().equals(param) || node.getAddress().equals(param) || node.getInviteId().equals(param)) { |
| | | return node; |
| | | } |
| | | |
| | | return getNode(node.CHILD, param); |
| | | } |
| | | |
| | | return null; |
| | | } |
| | | } |