前言:
当前小伙伴们对“数组转化成树形结构”大体比较注重,小伙伴们都想要分析一些“数组转化成树形结构”的相关资讯。那么小编也在网摘上收集了一些对于“数组转化成树形结构””的相关内容,希望我们能喜欢,兄弟们快快来了解一下吧!前言:
在编程中,树形结构是一种常见的数据结构,用于表示具有层级关系的数据。比如机构树、菜单树、目录树、文件夹树等等。如下图是一个树形结构。
我们看到树形结构,首先想到的是使用递归函数来遍历和构造树形结构。然而,递归虽然直观,但在处理大型数据集时可能会导致性能问题,尤其是当递归深度过大时,稍不注意还可能引发栈溢出错误。基于类似哈希映射(HashMap)和迭代的方式,能够高效地处理大量数据,同时避免了递归带来的潜在问题。
基于哈希映射java实现递归
首先我们创建一个TreeNode节点类:
import lombok.Data;import java.util.ArrayList;import java.util.List;@Datapublic class TreeNode { private String id; private String parentId; private List<TreeNode> children; // 假设还有其他字段... public TreeNode(String id, String parentId) { this.id = id; this.parentId = parentId; this.children = new ArrayList<>(); }}
创建一个转换类TreeUtils:
import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.List;import java.util.Map;public class TreeUtils { public static List<TreeNode> transformToTreeFormat(List<TreeNode> nodes) { if (nodes == null || nodes.isEmpty()) { return Collections.emptyList(); } Map<String, TreeNode> idNodeMap = new HashMap<>(); for (TreeNode node : nodes) { idNodeMap.put(node.getId(), node); } List<TreeNode> rootNodes = new ArrayList<>(); for (TreeNode node : nodes) { TreeNode parentNode = idNodeMap.get(node.getParentId()); if(parentNode != null && !node.getId().equals(node.getParentId())){ if (parentNode.getChildren() == null) { parentNode.setChildren(new ArrayList<>()); } parentNode.getChildren().add(node); }else{ rootNodes.add(node); } } return rootNodes; } }
上述一个类定义的递归的属性,然后一个utils工具类即可实现递归的操作。下面我们 可以写个测试类进行验证:
import com.google.gson.Gson;import com.google.gson.JsonObject;import java.util.ArrayList;import java.util.List;public class TreeTest { public static void main(String[] args) { // 创建测试数据 List<TreeNode> nodes = new ArrayList<>(); nodes.add(new TreeNode("1", null)); // 根节点 nodes.add(new TreeNode("2", "1")); // 1的子节点 nodes.add(new TreeNode("3", "1")); // 1的子节点 nodes.add(new TreeNode("4", "2")); // 2的子节点 nodes.add(new TreeNode("5", "2")); // 2的子节点 nodes.add(new TreeNode("6", "3")); // 3的子节点 nodes.add(new TreeNode("7", null)); // 另一个根节点 nodes.add(new TreeNode("8", "7")); // 7的子节点 nodes.add(new TreeNode("9", "8")); // 8的子节点 nodes.add(new TreeNode("10", "8")); // 8的子节点 // 调用transformToTreeFormat方法转换节点列表为树形结构 List<TreeNode> tree = TreeUtils.transformToTreeFormat(nodes); System.out.println(new Gson().toJson(tree)); } }
最后,我们使用json在线工具,格式化生成的结构,即为树形结构的返回结果。
总结
上面使用了一个utils小工具实现树形结构。利用哈希映射的快速查找特性,避免了递归带来的性能开销。同时,通过两次遍历节点数组,我们可以有效地构建出完整的树形结构。
这种方法在处理大型数据集时表现出色。与递归方法相比,它的性能更好,且更加稳定。
标签: #数组转化成树形结构