一、数据结构
@Setter
@Getter
public class A {
private Integer i;
private List<A> children;
}
二、需求描述
如上所述的树,现在已知子节点121/132,需要返回数据如下:
三、算法如下
private void getSubTree(A a, List<Integer> target) {
List<A> children = new ArrayList<>();
for (A o : a.getChildren()) {
//这里当作一个变量来保存状态
List<Integer> exist = new ArrayList<>();
if (target.contains(o.getI())) {
children.add(o);
break;
}
traversal(o.getChildren(), exist, target);
if (exist.size() > 0) {
children.add(o);
}
}
a.setChildren(children);
}
private void traversal(List<A> list, List<Integer> exist, List<Integer> target) {
if (list == null) {
return;
}
if (exist.size() > 0) {
return;
}
for (A a : list) {
if (target.contains(a.getI())) {
exist.add(1);
break;
}
traversal(a.getChildren(), exist, target);
if (exist.size() > 0) {
break;
}
}
}
四、测试
public static void main(String[] args) {
String s = "{\"children\":[{\"children\":[{\"children\":[{\"i\":111},{\"i\":112}],\"i\":11},{\"children\":[{\"i\":121},{\"i\":122}],\"i\":12},{\"children\":[{\"i\":131},{\"i\":132}],\"i\":13}],\"i\":1},{\"children\":[{\"children\":[{\"i\":211},{\"i\":212}],\"i\":21},{\"children\":[{\"i\":221},{\"i\":222}],\"i\":22}],\"i\":2}],\"i\":0}";
A a = JSONObject.parseObject(s, A.class);
System.out.println(JSONObject.toJSONString(a));
new A().getSubTree(a, Lists.newArrayList(121));
System.out.println(JSONObject.toJSONString(a));
}
打印结果
原始数据:
{
"children": [{
"children": [{
"children": [{
"i": 111
}, {
"i": 112
}],
"i": 11
}, {
"children": [{
"i": 121
}, {
"i": 122
}],
"i": 12
}, {
"children": [{
"i": 131
}, {
"i": 132
}],
"i": 13
}],
"i": 1
}, {
"children": [{
"children": [{
"i": 211
}, {
"i": 212
}],
"i": 21
}, {
"children": [{
"i": 221
}, {
"i": 222
}],
"i": 22
}],
"i": 2
}],
"i": 0
}
过滤后数据:
{
"children": [{
"children": [{
"children": [{
"i": 111
}, {
"i": 112
}],
"i": 11
}, {
"children": [{
"i": 121
}, {
"i": 122
}],
"i": 12
}, {
"children": [{
"i": 131
}, {
"i": 132
}],
"i": 13
}],
"i": 1
}],
"i": 0
}