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

这里我是用的一个资源目录类对象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 returnList = new ArrayList();
	
	/**
	 * 根据父节点的ID获取所有子节点
	 * @param list 分类
	 * @param typeId 传入的父节点ID
	 * @return List
	 */
	public List getChildNodes(List list, Long typeId) {
		if(list == null && typeId == null) return null;
		for (Iterator 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 list, Long typeId) {
		if(list == null && typeId == null) return "";
		for (Iterator 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 list, SourceDir node) {
		List childList = getChildList(list, node);// 得到子节点列表
		if (hasChild(list, node)) {// 判断是否有子节点
			returnList.add(node);
			Iterator it = childList.iterator();
			while (it.hasNext()) {
				SourceDir n = (SourceDir) it.next();
				recursionFn(list, n);
			}
		} else {
			
			returnList.add(node);
		}
	}
	
	
	/**
	 * 根据父节点获取他的下一级子节点(注意是只得到下一级的,不是全部的)
	 * @param list 分类表
	 * @return List
	 */
	public List getChildList(List list, SourceDir node) {
		List nodeList = new ArrayList();
		Iterator 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 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 listAll = nodeUtil.getChildNodes(list,nodeid);
//nodeid为截取子树的根节点id



你可能感兴趣的:(Java,算法)