java 树的层次遍历_Java遍历树的层级 - osc_jegm3yg5的个人空间 - OSCHINA - 中文开源技术交流社区...
非科班出身,欢迎指正。
要实现的逻辑是,在一棵树中,给出任意一个节点,获取到该节点下的N个层级。
一.树型结构
下图的树中,节点上的字母代表节点的名字,字母下的代表该节点的下单金额。
二.数据准备
组装数据
package ATree;
import java.util.ArrayList;
import java.util.List;
public class PreData {
public static List getData(){
NodeOrder A = new NodeOrder("0", "A","-1","123");
NodeOrder B = new NodeOrder("1", "B","0","10");
NodeOrder C = new NodeOrder("2", "C","0","20");
NodeOrder D = new NodeOrder("3", "D","0","30");
NodeOrder E = new NodeOrder("4", "E","1","40");
NodeOrder F = new NodeOrder("5", "F","3","50");
NodeOrder G = new NodeOrder("6", "G","3","60");
NodeOrder H = new NodeOrder("7", "H","4","70");
NodeOrder I = new NodeOrder("8", "I","4","80");
NodeOrder J = new NodeOrder("9", "J","4","90");
NodeOrder K = new NodeOrder("10","K","6","100");
NodeOrder L = new NodeOrder("11","L","8","110");
NodeOrder M = new NodeOrder("12","M","10","120");
NodeOrder N = new NodeOrder("13","N","10","130");
NodeOrder O = new NodeOrder("14","O","12","140");
NodeOrder P = new NodeOrder("15","P","12","150");
NodeOrder Q = new NodeOrder("16","Q","13","160");
NodeOrder R = new NodeOrder("17","R","13","170");
NodeOrder S = new NodeOrder("18","S","13","180");
NodeOrder T = new NodeOrder("19","T","15","190");
NodeOrder U = new NodeOrder("20","U","15","200");
NodeOrder V = new NodeOrder("21","V","19","210");
NodeOrder W = new NodeOrder("22","W","19","220");
NodeOrder X = new NodeOrder("23","X","20","230");
NodeOrder Y = new NodeOrder("24","Y","20","240");
NodeOrder Z = new NodeOrder("25","Z","20","250");
List list = new ArrayList<>();
list.add(A);
list.add(B);
list.add(C);
list.add(D);
list.add(E);
list.add(F);
list.add(G);
list.add(H);
list.add(I);
list.add(J);
list.add(K);
list.add(L);
list.add(M);
list.add(N);
list.add(O);
list.add(P);
list.add(Q);
list.add(R);
list.add(S);
list.add(T);
list.add(U);
list.add(V);
list.add(W);
list.add(X);
list.add(Y);
list.add(Z);
return list;
}
}
package ATree;
import java.math.BigDecimal;
public class NodeOrder {
private String id;
private String tag;
private String parentId;
private BigDecimal orderAmount;
public NodeOrder(String id, String tag, String parentId, String orderAmount) {
this.id = id;
this.tag = tag;
this.parentId = parentId;
this.orderAmount = new BigDecimal(orderAmount);
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTag() {
return tag;
}
public void setTag(String tag) {
this.tag = tag;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public BigDecimal getOrderAmount() {
return orderAmount;
}
public void setOrderAmount(BigDecimal orderAmount) {
this.orderAmount = orderAmount;
}
}
编写逻辑
packageATree;importcom.alibaba.fastjson.JSON;importorg.apache.commons.collections.CollectionUtils;importjava.math.BigDecimal;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.stream.Collectors;public classTest {//计算层级的最大值
public static final int MAX_LEVEL = 3;public static voidmain(String[] args) {
Test test= newTest();
List list =PreData.getData();
test.start("10",list);
}public void start(String id, Listsources){
Map> parentMap =groupByParentId(sources);
Map> levelMap = new HashMap<>();
getLevel(id, parentMap, levelMap,1);
System.out.println(JSON.toJSONString(levelMap));
}public void getLevel(String parentId,Map> parentMap,Map> levelMap,intcount){//根据parentId获取节点
List nextLevel =parentMap.get(parentId);if(CollectionUtils.isEmpty(nextLevel))return;
String countStr=String.valueOf(count);
List thisLevel =levelMap.get(countStr);if(CollectionUtils.isEmpty(thisLevel)) {
levelMap.put(countStr, nextLevel);
}else{
thisLevel.addAll(nextLevel);
levelMap.put(countStr, thisLevel);
}
count++;if(count >MAX_LEVEL)return;for(NodeOrder nodeOrder : nextLevel) {
String tempParentId=nodeOrder.getId();
getLevel(tempParentId, parentMap, levelMap, count);
}
}//按父节点分组
public Map> groupByParentId(Listsources){
Map> listGroupby =sources.parallelStream().collect(Collectors.groupingBy(NodeOrder::getParentId));returnlistGroupby;
}
}
三.测试
按照图中的树形结构,以K节点举例,遍历得到K节点下的3个层级,输出的字符串为:
{"1":[{"id":"12","orderAmount":120,"parentId":"10","tag":"M"},{"id":"13","orderAmount":130,"parentId":"10","tag":"N"}],"2":[{"id":"14","orderAmount":140,"parentId":"12","tag":"O"},{"id":"15","orderAmount":150,"parentId":"12","tag":"P"},{"id":"16","orderAmount":160,"parentId":"13","tag":"Q"},{"id":"17","orderAmount":170,"parentId":"13","tag":"R"},{"id":"18","orderAmount":180,"parentId":"13","tag":"S"}],"3":[{"id":"19","orderAmount":190,"parentId":"15","tag":"T"},{"id":"20","orderAmount":200,"parentId":"15","tag":"U"}]}
JSON结构为:
1 {2 "1": [3 {4 "id": "12",5 "orderAmount": 120,6 "parentId": "10",7 "tag": "M"
8 },9 {10 "id": "13",11 "orderAmount": 130,12 "parentId": "10",13 "tag": "N"
14 }15 ],16 "2": [17 {18 "id": "14",19 "orderAmount": 140,20 "parentId": "12",21 "tag": "O"
22 },23 {24 "id": "15",25 "orderAmount": 150,26 "parentId": "12",27 "tag": "P"
28 },29 {30 "id": "16",31 "orderAmount": 160,32 "parentId": "13",33 "tag": "Q"
34 },35 {36 "id": "17",37 "orderAmount": 170,38 "parentId": "13",39 "tag": "R"
40 },41 {42 "id": "18",43 "orderAmount": 180,44 "parentId": "13",45 "tag": "S"
46 }47 ],48 "3": [49 {50 "id": "19",51 "orderAmount": 190,52 "parentId": "15",53 "tag": "T"
54 },55 {56 "id": "20",57 "orderAmount": 200,58 "parentId": "15",59 "tag": "U"
60 }61 ]62 }
java 树的层次遍历_Java遍历树的层级 - osc_jegm3yg5的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐
- java有没有回调函数_Java中的回调函数 - wangjianme的个人空间 - OSCHINA - 中文开源技术交流社区...
Java代码的回调函数经常由框架或是系统定义,由程序开发人员填充. 它的最主要特点是即定义了调用的规范同时又非常的灵活. 回调函数有些类似于观察者模式,它们的区别在于:观察者模式返回的参数为Event ...
- java实现gdal栅格矢量化_gdal栅格矢量化 - osc_lfs4vsih的个人空间 - OSCHINA - 中文开源技术交流社区...
#include "gdal_alg.h" 栅格矢量化功能用于将栅格数据生成矢量数据,通常用于分类图像.GDAL库中使用函数GDALPolygonize()或者函数GDALFPol ...
- 最新JAVA性能调优实战教程_java性能调优实战 - osc_9z8xc00s的个人空间 - OSCHINA - 中文开源技术交流社区...
在项目压测过程中,发现系统占用,上下文切换非常频繁,在此记录下调优过程,希望对后来人有所帮助. 测试方法:模拟客户端实际操作,向服务器高并发发送数据,查看服务器的负载情况. 服务器基本配置如下 1,基 ...
- java痴和堆_JAVA虚拟机理解 - 爱笑的痴迷者的个人空间 - OSCHINA - 中文开源技术交流社区...
JVM定义: JVM(Java Virtual Machine),是一种运行Java程序的软件实现,是虚拟的机器.Java程序与平台无关,它直接在虚拟机中运行. JVM运行过程: JVM将内存分划如下 ...
- java代餐计算器_java入门7 - 千言sully的个人空间 - OSCHINA - 中文开源技术交流社区...
1...访问修饰符 返回值类型 方法名(参数列表){} 访问修饰符:方法允许访问的权限范围 返回值类型:void是不带return返回值的, 如果带返回值,此时要把返回值类型写出来 方法名( ...
- java 车站分级_做题中的错误总结 - osc_p4wgjz7p的个人空间 - OSCHINA - 中文开源技术交流社区...
马上NOIP2018啦,突然发现自己比去年还菜,写水题时出现了很多错误,记录一下. 2018.7.8 luoguP2016 战略游戏 节点从0编号. 所以以i为根时不能设i的根为0,应设为-1 for ...
- java选择排序不稳定_选择排序就这么简单 - Java3y的个人空间 - OSCHINA - 中文开源技术交流社区...
选择排序就这么简单 从上一篇已经讲解了冒泡排序了,本章主要讲解的是选择排序,希望大家看完能够理解并手写出选择排序的代码,然后就通过面试了!如果我写得有错误的地方也请大家在评论下指出. 选择排序介绍和稳 ...
- Java做诗_搞IT,抽空写写诗 - mellen的个人空间 - OSCHINA - 中文开源技术交流社区...
搞IT也可换换思路. 下面献丑一个本人的诗 <很长很长的一朵朵> -------(比较长)-------- 雨随着月夜纷飞, 错过的是树下的积水 眼前熟悉的影像, 却忽然变得很陌生, 心深 ...
- java亲密数的解题思路,算法解题思路总结 - jjhgx的个人空间 - OSCHINA - 中文开源技术交流社区...
算法解题思路: 细读算法要求 找到极限情况 找到临界情况,结果依赖 找到最终的结束求解点 编程实现:考虑算法的空间复杂度和时间复杂度 案例说明: 假设: 输入字符串为:s, 长度为:slen, s的第 ...
最新文章
- java动态加载配置文件
- 禁止直接在浏览器输入网址访问的代码
- asp.net控件库FineUI使用入门图解
- Impala性能优化
- 局部图像描述子——Harris角点检测器
- 阿里云服务器 搭建单体redis 以及踩坑
- 阿里宣布取消的周报又死灰复燃?3分钟的高效报表才是最后出路
- (20)Xilinx PCIE中断调试成功(学无止境)
- 【80万年薪】2019 互联网校招薪酬曝光,看你能拿到多少钱!
- java面向对象计算机与CD实验,Java面向对象上机实验指导书.doc
- 最短路最小生成树水题
- JavaScript设计模式入坑 1
- C#自学总结_Day2
- ppc+安装编译mysql_redhat7ppc安装
- XMPP即时通讯协议使用(前传)——协议详解
- Spark实现jieba中文分词(scala)
- 如何用计算机算十进制,计算器怎么,计算机是怎么转换二进制为十进制的
- python 利用matploylib画动态雷达实时显示图
- HDLBITS 练习 卡诺图化简部分
- Python词云_自定义图片做背景
热门文章
- CSS选择器的声明与嵌套
- python selenium框架_基于python+selenium的框架思路
- oracle层次查询中prior与自上而下、自下而上查询
- python入门基础系列_Python3基础系列-基本入门语法
- 关于排序速度效率数组集合选择那点事
- C语言程序流程设计之循环【程序流程设计】(13)
- 10的预览模式_谷歌相机2020年3月更新汇总,适配米10等五摄手机,30s手动曝光
- 阿里云徐立:面向容器和 Serverless Computing 的存储创新
- 阿里云故障演练平台获得可信云最高等级认证,为企业数字韧性能力保驾护航
- Kubernetes 弹性伸缩全场景解读(二)- HPA 的原理与演进