From c881dcbb782d209f43b9a2878de613e0124e0421 Mon Sep 17 00:00:00 2001 From: KKSU <15274802129@163.com> Date: Sun, 07 Jul 2024 12:53:00 +0800 Subject: [PATCH] 逻辑 --- src/main/java/cc/mrbird/febs/tree/MatrixTree.java | 144 +++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 142 insertions(+), 2 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/tree/MatrixTree.java b/src/main/java/cc/mrbird/febs/tree/MatrixTree.java index 259294f..dbaa294 100644 --- a/src/main/java/cc/mrbird/febs/tree/MatrixTree.java +++ b/src/main/java/cc/mrbird/febs/tree/MatrixTree.java @@ -1,16 +1,30 @@ package cc.mrbird.febs.tree; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.json.JSONUtil; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayDeque; + /** * @author wzy * @date 2022-08-23 **/ +@Slf4j public class MatrixTree { + + private static final MatrixTree matrixTree = new MatrixTree(); + public static MatrixTree getInstance() { + return matrixTree; + } // 节点数量 private int count = 0; private MemberNode root; - public MatrixTree() {} + public MatrixTree() { + count = 1; + } public MatrixTree(MemberNode root) { count = 1; @@ -19,6 +33,105 @@ public int getCount() { return count; + } + + /** + * 添加节点到树中 + * 先判断该节点的直推荐人是否在树中,若在则判断该推荐人的矩阵是否完成,若未完成则添加到该矩阵中,若已完成,则完善整个树 + * 如果直推荐人没有在树中,则直接添加到树 + * + * @param node 待添加的节点 + * @return 返回父节点 + */ + public MemberNode addNode(MemberNode node) { + if (root == null) { + root = node; + return null; + } + + count++; + + MemberNode parent = getNode(node.getRefererId()); + MemberNode memberNode = null; + if (parent != null) { + memberNode = wholeMatrix(parent, node, 2, 1); + } + + if (memberNode != null) { + return memberNode; + } + + MemberNode notWholeNode = getNotWholeNode(); + if (notWholeNode.getLeft() == null) { + notWholeNode.setLeft(node); + } else { + notWholeNode.setRight(node); + } + + return notWholeNode; + } + + /** + * 通过层级遍历,依次获取没有完整左右子节点的节点 + * + * @return + */ + public MemberNode getNotWholeNode() { + 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.getLeft() == null || memberNode.getRight() == null) { + result = memberNode; + break; + } + + deque.addLast(memberNode.getLeft()); + deque.addLast(memberNode.getRight()); + } + + if (result != null) { + break; + } + } + return result; + } + + /** + * 将节点添加到矩阵。若矩阵已完成,直接返回null + * + * @param node 矩阵root节点 + * @param newNode 待添加的节点 + * @param depth 矩阵深度(目前为2) + * @param index 当前所有深度 + * @return + */ + public MemberNode wholeMatrix(MemberNode node, MemberNode newNode, int depth, int index) { + if (node.getLeft() == null) { + node.setLeft(newNode); + return node; + } + + if (node.getRight() == null) { + node.setRight(newNode); + return node; + } + + if (index >= depth) { + return null; + } + + MemberNode left = wholeMatrix(node.getLeft(), newNode, depth, index + 1); + if (left != null) { + return left; + } + + return wholeMatrix(node.getRight(), newNode, depth, index + 1); } /** @@ -42,7 +155,7 @@ return null; } - if (node.getMemberId().equals(param) || node.getAddress().equals(param) || node.getInviteId().equals(param)) { + if (node.getFundId().equals(param) ||node.getMemberId().equals(param) || node.getAddress().equals(param) || node.getInviteId().equals(param)) { return node; } @@ -53,4 +166,31 @@ return getNode(node.getRight(), param); } + + /** + * 移除树中节点 + * + * @param param + */ + public void remove(Object param) { + } + + public static void main(String[] args) { + MatrixTree matrixTree = new MatrixTree(); + String refererId = null; + for (int i = 0; i < 11; i++) { + String inviteId = RandomUtil.randomString(6); + if (i == 0) { + refererId = inviteId; + } + MemberNode memberNode = new MemberNode(); + memberNode.setMemberId(Long.parseLong(i + 1 + "")); + memberNode.setInviteId(inviteId); + memberNode.setAddress(RandomUtil.randomString(14)); + memberNode.setRefererId(refererId); + matrixTree.addNode(memberNode); + } + System.out.println(JSONUtil.parseObj(matrixTree)); + System.out.println(System.currentTimeMillis()); + } } -- Gitblit v1.9.1