閑着無聊 寫了個常用的遞歸樹結構算法,比較簡陋都是遍歷 簡單粗暴,可以加一些排序 二分查找算法來優化,等有空我在研究下
package base; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.alibaba.fastjson.JSON; public class TreeTest { private Integer id ; private Integer pId ; private String name; private List<TreeTest> children; public TreeTest() { } public TreeTest(Integer id, Integer pId, String name) { super(); this.id = id; this.pId = pId; this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getpId() { return pId; } public void setpId(Integer pId) { this.pId = pId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<TreeTest> getChildren() { return children; } public void setChildren(List<TreeTest> children) { this.children = children; } @Override public String toString() { return "TreeTest [id=" + id + ", pId=" + pId + ", name=" + name + ", children=" + children + "]"; } //測試數據 public static void main(String[] args) { Map<Integer,TreeTest> map = new HashMap<Integer,TreeTest>(); TreeTest terr1 = new TreeTest(1,0,"一級父節點"); TreeTest terr2 = new TreeTest(2,1,"一級1子節點"); TreeTest terr3 = new TreeTest(3,2,"一級2子節點"); TreeTest terr4 = new TreeTest(4,0,"二級父節點"); TreeTest terr5 = new TreeTest(5,4,"二級1子節點"); TreeTest terr6 = new TreeTest(6,4,"二級1子節點2"); TreeTest terr7 = new TreeTest(7,3,"一級3子節點"); TreeTest terr8 = new TreeTest(8,5,"二級2子節點"); map.put(terr1.getId(), terr1); map.put(terr2.getId(), terr2); map.put(terr3.getId(), terr3); map.put(terr4.getId(), terr4); map.put(terr5.getId(), terr5); map.put(terr6.getId(), terr6); map.put(terr7.getId(), terr7); map.put(terr8.getId(), terr8); List<TreeTest> li = getChildren(map,0,1); System.out.println(JSON.toJSON(li)); } //遞歸樹 public static List<TreeTest> getChildren(Map<Integer,TreeTest> trees,Integer id,Integer leve){ List<TreeTest> list = new ArrayList<TreeTest>(); for (TreeTest tree : trees.values()) { if(id == tree.getpId()){ System.out.println("-遞歸" + tree.toString()); List<TreeTest> chidren = getChildren(trees,tree.getId(),++leve); list.add(tree);//本身 tree.setChildren(chidren);//子節點 leve--; } } return list; } }