递归树形结构数据删除和读取
删除
存储:每个节点有一个ID属性和ParentID属性。
树结构, Node0为根节点:
Node0
|--Node11
|-----Node21
|-----Node22
|-------Node31
|--Node12
|-----Node23
|-----Node24
|-------Node32
关键代码片段:
public void delete(String id){
List<UserGroup> groups=new ArrayList<UserGroup>(); //必须New一个对象。
groups=userGroupDao.findSubGroup(id); //找出子节点
for(UserGroup group:groups) {
delete(group.getId());
}
userGroupDao.delete(id);
}
调用方法:如果要删除Node0及其下所有节点,只需传入Node0的ID。
读取
表结构如下,通过parentId来实现递归。
后端构建菜单树
使用List<Menu> children来放置递归数据。
/**
* 构建菜单树json
* @param menuList
* @return
*/
public List<Menu> createMenuTree(List<Menu> menuList) {
List<Menu> nodeList = new ArrayList<Menu>();
for (Menu menu1 : menuList) {
boolean mark = false;
for (Menu menu2 : menuList) {
if (menu1.getParentId() == menu2.getId()) {
mark = true;
if (menu2.getChildren() == null) {
menu2.setChildren(new ArrayList<Menu>());
}
menu2.getChildren().add(menu1);
break;
}
}
if (!mark) {
nodeList.add(menu1);
}
}
return nodeList;
}
前端加载树
$("#btnGetMenu").live("click", function () {
var menuName=$("#txtMenuName").val();
$.ajax({
type: "POST",
cache : false,
url: basePath+"/getmenu",
data : {menuName:menuName},
dataType: 'json',
success : function(data){
alert(loadMent(data,0));
},
error : function(){
alert("error");
}
});
});
//采用递归算法加载树形菜单
var menuStr="";
var deep=0;
function loadMent(data){
var temp="";
if(deep==1){
temp=" ";
}
if(deep==2){
temp=" ";
}
$.each(data, function(i, item) {
menuStr+=temp+item.menuName+"\n";
if(item.children.length>0){
deep++;
loadMent(item.children);
}
});
deep=0;
return menuStr;
}