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 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 nodeList, Object param) { if (CollUtil.isEmpty(nodeList)) { return null; } for (MemberNode node : nodeList) { if (node.getMemberId().equals(param) || node.getPhone().equals(param) || node.getInviteId().equals(param)) { return node; } return getNode(node.CHILD, param); } return null; } }