KKSU
2024-06-17 676177dc1c4967b30470ee50df6fc30caf396aa9
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());
    }
}