给定一个树的节点ID,递归遍历出以这个节点为根的子树,以JSON格式返回

3 篇文章 0 订阅

这里我是用的一个资源目录类对象SourceDir,它里面有nodeid,pnodeid(父节点),nodename等信息,具体代码如下,这是一个工具类,需要的话自己修改一下List对象即可

import catalog.sourcedir.models.SourceDir;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class NodeUtil {
	
	 List<SourceDir> returnList = new ArrayList<SourceDir>();
	
	/**
	 * 根据父节点的ID获取所有子节点
	 * @param list 分类
	 * @param typeId 传入的父节点ID
	 * @return List<Sourcedir>
	 */
	public List<SourceDir> getChildNodes(List<SourceDir> list, Long typeId) {
		if(list == null && typeId == null) return null;
		for (Iterator<SourceDir> iterator = list.iterator(); iterator.hasNext();) {
			SourceDir node = (SourceDir) iterator.next();
			// 一、根据传入的某个父节点ID,遍历该父节点的所有子节点
			if (node.getPnodeid() != 0 && typeId.equals(node.getNodeid())) {
				recursionFn(list, node);
			}
			// 二、遍历所有的父节点下的所有子节点
			/*if (node.getParentId()==0) {
				recursionFn(list, node);
			}*/
		}
		return returnList;
	}
	
	/**
	 * 根据父节点的ID获取所有子节点
	 * @param list 分类
	 * @param typeId 传入的父节点ID
	 * @return String
	 */
	public String getChildNodesStr(List<SourceDir> list, Long typeId) {
		if(list == null && typeId == null) return "";
		for (Iterator<SourceDir> iterator = list.iterator(); iterator.hasNext();) {
			SourceDir node = (SourceDir) iterator.next();
			// 一、根据传入的某个父节点ID,遍历该父节点的所有子节点
			if (node.getPnodeid() != 0 && typeId.equals(node.getNodeid())) {
				recursionFn(list, node);
			}
			// 二、遍历所有的父节点下的所有子节点
			/*if (node.getParentId()==0) {
				recursionFn(list, node);
			}*/
		}
		return returnList.toString();
	}
	
	
	private void recursionFn(List<SourceDir> list, SourceDir node) {
		List<SourceDir> childList = getChildList(list, node);// 得到子节点列表
		if (hasChild(list, node)) {// 判断是否有子节点
			returnList.add(node);
			Iterator<SourceDir> it = childList.iterator();
			while (it.hasNext()) {
				SourceDir n = (SourceDir) it.next();
				recursionFn(list, n);
			}
		} else {
			
			returnList.add(node);
		}
	}
	
	
	/**
	 * 根据父节点获取他的下一级子节点(注意是只得到下一级的,不是全部的)
	 * @param list 分类表
	 * @return List<SourDir>
	 */
	public List<SourceDir> getChildList(List<SourceDir> list, SourceDir node) {
		List<SourceDir> nodeList = new ArrayList<SourceDir>();
		Iterator<SourceDir> it = list.iterator();
		while (it.hasNext()) {
			SourceDir n = (SourceDir) it.next();
			if (n.getPnodeid().equals(node.getNodeid())) {
				nodeList.add(n);
			}
		}
		return nodeList;
	}

	/**
	 * 根据父节点判断是否有子节点
	 * @param list 分类表
	 * @return boolean
	 */
	public boolean hasChild(List<SourceDir> list, SourceDir node) {
		return getChildList(list, node).size() > 0 ? true : false;
	}
	
	

}

SourceDir实体类如下:

public class SourceDir extends Model implements java.io.Serializable {

	// Fields
	private Long nodeid;
	private Long pnodeid;
	private String nodename;
	private Long treeid;
	private String nodefcode;
	private String nodenote;
	private String arci;
	private String oldnodeid;
	private Long showorder;
	private String nodepath;
	// Constructors
        // set get 方法
}


调用方法如下

NodeUtil nodeUtil = new NodeUtil();
                List<SourceDir> listAll = nodeUtil.getChildNodes(list,nodeid);
//nodeid为截取子树的根节点id



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值