您的位置:首页 > 财经 > 金融 > 手机官方_昆明凡科建站_学网络营销去哪个学校_网络推广网站排名

手机官方_昆明凡科建站_学网络营销去哪个学校_网络推广网站排名

2024/11/18 5:24:46 来源:https://blog.csdn.net/weixin_43833540/article/details/143475920  浏览:    关键词:手机官方_昆明凡科建站_学网络营销去哪个学校_网络推广网站排名
手机官方_昆明凡科建站_学网络营销去哪个学校_网络推广网站排名

在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"
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com