From e1114bf474d183b8ce985b2c4772ffe2d81397b6 Mon Sep 17 00:00:00 2001
From: Hentua <wangdoubleone@gmail.com>
Date: Tue, 18 Apr 2023 17:59:52 +0800
Subject: [PATCH] 添加三叉树逻辑
---
src/main/java/cc/mrbird/febs/common/tree/MatrixTree.java | 115 ++++++++++++++++++++++++++++
src/main/java/cc/mrbird/febs/common/tree/MemberNode.java | 37 +++++++++
src/test/java/cc/mrbird/febs/TreeTest.java | 30 +++++++
3 files changed, 182 insertions(+), 0 deletions(-)
diff --git a/src/main/java/cc/mrbird/febs/common/tree/MatrixTree.java b/src/main/java/cc/mrbird/febs/common/tree/MatrixTree.java
new file mode 100644
index 0000000..7d7d263
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/common/tree/MatrixTree.java
@@ -0,0 +1,115 @@
+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;
+ }
+}
diff --git a/src/main/java/cc/mrbird/febs/common/tree/MemberNode.java b/src/main/java/cc/mrbird/febs/common/tree/MemberNode.java
new file mode 100644
index 0000000..c60e421
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/common/tree/MemberNode.java
@@ -0,0 +1,37 @@
+package cc.mrbird.febs.common.tree;
+
+import lombok.Data;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2022-08-23
+ **/
+@Data
+public class MemberNode {
+
+ private Long memberId;
+
+ private String address;
+
+ private String inviteId;
+
+ private String refererId;
+
+ public List<MemberNode> CHILD = new LinkedList<>();
+
+ public MemberNode(Long memberId, String address, String inviteId, String refererId) {
+ this.memberId = memberId;
+ this.address = address;
+ this.inviteId = inviteId;
+ this.refererId = refererId;
+ }
+
+ public MemberNode() {}
+
+ public void addNode(MemberNode node) {
+ this.CHILD.add(node);
+ }
+}
diff --git a/src/test/java/cc/mrbird/febs/TreeTest.java b/src/test/java/cc/mrbird/febs/TreeTest.java
new file mode 100644
index 0000000..28f5322
--- /dev/null
+++ b/src/test/java/cc/mrbird/febs/TreeTest.java
@@ -0,0 +1,30 @@
+package cc.mrbird.febs;
+
+import cc.mrbird.febs.common.tree.MatrixTree;
+import cc.mrbird.febs.common.tree.MemberNode;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+/**
+ * @author wzy
+ * @date 2023-04-18
+ **/
+@Slf4j
+@SpringBootTest
+public class TreeTest {
+
+ @Test
+ public void treeTest() {
+ MatrixTree instance = MatrixTree.getInstance();
+ for (int i = 0; i < 20; i++) {
+ MemberNode node = new MemberNode();
+ node.setMemberId((long) i);
+ node.setInviteId(String.valueOf(i));
+ node.setAddress(String.valueOf(i));
+ instance.addNode(node);
+ }
+
+ System.out.println(111);
+ }
+}
--
Gitblit v1.9.1