java实现树形结构还在用递归?看完这个教你如何高效率遍历封装树形结构
递归遍历树形结构
以下是递归代码
可以看到我们该代码中的递归方式,需要将集合中的代码不断递归以及封装子节点,相当于每次构建一个节点数据就需要把之前的node集合在遍历一遍。由此看出递归封装树形结构时间复杂度和空间复杂度是 o(n)
/**
* 递归封装树形结构
* @param node
* @param id
* @return
*/
public static List<Tree> buildTree(List<Tree> node, Integer id) {
List<Tree> res = new ArrayList<>();
node.forEach(n->{
if (n.getParentId().equals(id)){
n.setNodes(buildTree(node,n.getId()));
res.add(n);
}
});
return res;
}
hash表实现树形结构
以下是用的是hashMap来实现
通过hash表实现树形结构,只需要两遍循环即可完成封装树形结构
第一遍循环:将所有对象id为key,value为当前对象存入hashMap表中
第二遍循环:使用之前已经存入的hashMap表,通过当前对象的parentId(父级id)获取父级对象,存入当前父级对象中的子级对象里
由此可以看出,使用hash表来实现,只需要两遍循环就可以完成构建出树形结构,效率性能都比较好
public static List<Tree> buildTree(List<Tree> node) {
List<Tree> res = new ArrayList<>();
Map<Integer,Tree> map=new HashMap<>();
node.forEach(n->map.put(n.getId(),n));
node.forEach(n->{
//表示不是根目录
if (n.getParentId()!=0){
//get当前父级节点
Tree tree = map.get(n.getParentId());
//将当前对象添加到当前父级节点的子级节点属性中
tree.getNodes().add(n);
}else {
res.add(n);
}
});
return res;
}
递归和hash表构建树形结构性能测试
递归实现
设置50000个数据,先看下递归需要多久
可以看到足足花了五万多毫秒,差不多五十多秒
hash表实现
看!使用hash表,六百多毫秒,五万数据耗时一秒不到!