From 4a347c0ab4b88fd792d24d30bed36b1fa769d3a2 Mon Sep 17 00:00:00 2001
From: KKSU <15274802129@163.com>
Date: Mon, 15 Jul 2024 14:14:04 +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