一、想要实现的效果 - 以搜索“秦朗为例”,最后返回的是 三国-曹操-秦朗 的一条链路(一棵树)。  二、我的代码 public class People { private List children; private String name; // 省略getter、setter方法 } public static void main(String[] args) { People sunce = new People(); sunce.setName("孙策"); People sunquan = new People(); sunquan.setName("孙权"); People sunjian = new People(); sunjian.setName("孙坚"); sunjian.setChildren(Arrays.asList(sunce, sunquan)); People caopi = new People(); caopi.setName("曹丕"); People caozhi = new People(); caozhi.setName("曹植"); People caozhang = new People(); caozhang.setName("曹彰"); People qinlang = new People(); qinlang.setName("秦朗"); People caocao = new People(); caocao.setName("曹操"); caocao.setChildren(Arrays.asList(caopi, caozhi, caozhang, qinlang)); People liufeng = new People(); liufeng.setName("刘封"); People liushan = new People(); liushan.setName("刘禅"); People liubei = new People(); liubei.setName("刘备"); liubei.setChildren(Arrays.asList(liufeng, liushan)); People liuxun = new People(); liuxun.setName("刘循"); People liuzhang = new People(); liuzhang.setName("刘璋"); liuzhang.setChildren(Arrays.asList(liuxun)); People liuyan = new People(); liuyan.setName("刘焉"); liuyan.setChildren(Arrays.asList(liuzhang)); People sanguo = new People(); sanguo.setName("三国"); sanguo.setChildren(Arrays.asList(sunjian, caocao, liubei, liuyan)); List p1 = query(sanguo, "刘"); System.out.println(p1); List p2 = query(sanguo, "秦"); System.out.println(p2); List p3 = query(sanguo, "孙策"); System.out.println(p3); } public static List query(People people, String name) { List result = new ArrayList(); // 这里要判空,但简写就省略了 if(people.getName().contains(name)) { return Arrays.asList(people); } else { if(people.getChildren() != null) { for (People p : people.getChildren()) { result.addAll(query(p, name)); } } } return result; } 三、代码执行结果  四、解释 我递归用的少,用起来有点不达意。上面自己写的递归方法虽然能实现递归效果,但问题很大。 4.1、我的方法返回的只是命中项,而不是一个树的结构(除非第一层就命中了)。 4.2、返回的树里没有剔除未命中项。 上述两点(4.1和4.2)能否同时做到?如果不能,请指教怎么实现4.1,感谢。