Adjacency List:每一條記錄存parent_id
Path Enumerations:每一條記錄存整個tree path通過的node枚舉
Nested Sets:每一條記錄存 nleft 和 nright
Closure Table:維護一個表,全部的tree path做爲記錄進行保存。java
各類方法的經常使用操做代價見下圖node
鄰接表再程序中的使用:直接查詢全部,而後構建樹形結構數據。有序數據構建樹,層級之間是有序的。可經過sql查詢排序。sql
TreeNode接口app
package klg.common.tree; import java.io.Serializable; import java.util.List; /** * * @author klguang * * @param <ID> */ public interface TreeNode<ID extends Serializable> { public ID getId(); public ID getParentId(); public <T extends TreeNode<ID>> void setChildren(List<T> children); }
TreeHelper工具類工具
package klg.common.tree; import java.io.Serializable; import java.util.ArrayList; import java.util.List; /** * * @author klguang * */ public class TreeHelper { /** * * @param parentID * null 爲根節點 * @param nodeList * @param sort * @return */ public static <ID extends Serializable,T extends TreeNode<ID>> List<T> buildTree(ID parentID, List<T> nodeList) { // 根節點列表 List<T> list = new ArrayList<>(); // 順序遍歷節點列表,若是以前是有序的,那麼構建樹後同層級之間有序 for (int i=0; i<nodeList.size(); i++) { T node = nodeList.get(i); //遞納入口, String.valueOf防止null值 if (String.valueOf(node.getParentId()).equals(String.valueOf(parentID))) { // parentID做爲入口 List<T> children = buildTree(node.getId(), nodeList); node.setChildren(children); list.add(node); } } return list; } }
案例easyui treeui
package klg.common.tree; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import javax.persistence.Access; import javax.persistence.AccessType; import javax.persistence.Column; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.MappedSuperclass; import javax.persistence.Transient; /** * * @author klguang * */ @MappedSuperclass @Access(AccessType.FIELD) public abstract class EasyUITreeNode<ID extends Serializable> implements Serializable, TreeNode<ID> { private static final long serialVersionUID = 850845227481354764L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private ID id; @Column(name = "parent_id") private ID parentId; @Column(name = "name", nullable = false) private String name; @Column(name = "icon_cls") private String iconCls; @Column(name = "state") private String state; @Column(name = "order_num") private Integer orderNum; @SuppressWarnings("rawtypes") @Transient List children = new ArrayList<>(); /** * easyui treegrid 需求格式 * * @return */ public String getText() { return this.name; } public ID getId() { return id; } public void setId(ID id) { this.id = id; } public ID getParentId() { return parentId; } public void setParentId(ID parentId) { this.parentId = parentId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getIconCls() { return iconCls; } public void setIconCls(String iconCls) { this.iconCls = iconCls; } public String getState() { return state; } public void setState(String state) { this.state = state; } public Integer getOrderNum() { return orderNum; } public void setOrderNum(Integer orderNum) { this.orderNum = orderNum; } @SuppressWarnings("unchecked") public <T extends TreeNode<ID>> List<T> getChildren() { return children; } public<T extends TreeNode<ID>> void setChildren(List<T> children) { this.children = children; } }
easyui tree實現類this
public class Permission extends EasyUITreeNode<Long> { //fields }
構建樹spa
public List<Permission> findAll(){ Sort sort = new Sort(Direction.ASC,"orderNum"); List<Permission> listData=permissionService.findList(sort); return TreeHelper.<Long,Permission>buildTree(null, listData); }