在Java中实现树结构并将其存储在MySQL数据库中涉及几个步骤。
MySQL表设计
CREATE TABLE TreeNode ( id INT AUTO_INCREMENT PRIMARY KEY, parentId INT, name VARCHAR(255)
)
id 是节点的唯一标识符。
parentId 是父节点的ID,根节点的 parentId 为 NULL。
name 是节点的名称或其他属性。
树节点
@Data
public class TreeNode { private int id; private Integer parentId; private String name; private List<TreeNode> children;
}
代码逻辑实现
递归实现
public class TreeBuilder {// 使用Map来存储节点,方便根据id查找private static Map<Integer, TreeNode> nodeMap = new HashMap<>();// 递归构建树的方法public static TreeNode buildTree(List<TreeNode> nodes, Integer rootPid) {// 将所有节点添加到Map中,方便后续查找for (TreeNode node : nodes) {nodeMap.put(node.getId(), node);}// 从Map中根据rootPid找到根节点,并递归构建树return buildTreeFromMap(rootPid);}// 递归辅助方法,从Map中构建树private static TreeNode buildTreeFromMap(Integer pid) {TreeNode currentNode = null;if (pid == null) {currentNode = nodeMap.get(pid);}// 如果pid为null,则查找父ID为null的节点作为根节点(假设只有一个根节点)if (currentNode == null && pid == null) {for (TreeNode node : nodeMap.values()) {if (node.getPid() == null) { // 或者使用 node.getPid() == SomeSpecialValuecurrentNode = node;break; // 找到根节点后退出循环}}}// 如果找到了当前节点(无论是根节点还是其他节点),则递归地为其添加子节点if (currentNode != null) {for (TreeNode node : nodeMap.values()) {if (Objects.equals(node.getPid(), currentNode.getId())) {currentNode.getChildren().add(buildTreeFromMap(node.getId()));}}}return currentNode;}
}
非递归实现
public class TreeBuilder {public static TreeNode buildTree(List<TreeNode> nodes) {// 使用Map来存储节点,方便根据id查找Map<Integer, TreeNode> nodeMap = new HashMap<>();TreeNode root = null;// 第一步:将所有节点添加到Map中for (TreeNode node : nodes) {nodeMap.put(node.getId(), node);}// 第二步:构建树结构for (TreeNode node : nodes) {// 如果pid为null,说明是根节点if (node.getPid() == null) {// 对多个根结点的检查if (root != null) {throw new IllegalArgumentException("结点列表中包含多个根结点");}root = node;} else {// 根据pid找到父节点,并将当前节点添加到父节点的children列表中TreeNode parentNode = nodeMap.get(node.getPid());if (parentNode != null) {parentNode.getChildren().add(node);}}}return root;}
}
测试
// 测试方法public static void main(String[] args) {List<TreeNode> nodes = new ArrayList<>();nodes.add(new TreeNode(1, null, "Root")); // 根节点,pid为nullnodes.add(new TreeNode(2, 1, "Child1"));nodes.add(new TreeNode(3, 1, "Child2"));nodes.add(new TreeNode(4, 2, "Grandchild1"));nodes.add(new TreeNode(5, 2, "Grandchild2"));nodes.add(new TreeNode(6, 3, "Grandchild3"));// 构建树TreeNode tree = buildTree(nodes, null);// 打印树结构System.out.println(JSONObject.toJSONString(tree));}
输出结果:
{"children": [{"children": [{"children": [],"id": 6,"name": "Grandchild3","pid": 3}],"id": 3,"name": "Child2","pid": 1},{"children": [{"children": [],"id": 4,"name": "Grandchild1","pid": 2},{"children": [],"id": 5,"name": "Grandchild2","pid": 2}],"id": 2,"name": "Child1","pid": 1}],"id": 1,"name": "Root"
}