Java递归树(构建和收集子孙节点二种方式)

本文介绍了TreeUtil工具类,包括递归方法用于构建树形结构,以及非树形结构中查找子孙节点的方法。通过实例展示了如何利用这些工具处理商品分类数据。核心内容涉及TreeNode节点类和TreeUtil的buildByRecursive与buildByRecursive方法的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TreeUtil

1.递归工具类:(构建递归树 且支持 通过 buildByRecursive方法 depth参数控制递归的层级深度 )

/**
 * @Description: 树节点
 * @Author: 徐刘
 * @Date: 2020/12/5 12:18
 */
@Data
public class TreeNode {
  
    protected String id;
  
    protected String parentId;

    private  int level;
    // 是否有子节点
    private  boolean isLeaf;

    List<TreeNode> children = new ArrayList<>();

    public void add(TreeNode node) {
        children.add(node);
    }

}

/**
 * @Description: tree结构工具类
 * @Author: 徐刘
 * @Date: 2020/12/5 12:17
 */
public class TreeUtil {
    /**
     * 两层循环实现建树
     *
     * @param treeNodes 传入的树节点列表
     * @return
     */
    public static <T extends TreeNode> List<T> bulid(List<T> treeNodes, Object root) {

        List<T> trees = new ArrayList<T>();

        for (T treeNode : treeNodes) {

            if (root.equals(treeNode.getParentId())) {
                trees.add(treeNode);
            }

            for (T it : treeNodes) {
                if (StringUtils.equalsIgnoreCase(it.getParentId(), treeNode.getId())) {
                    if (CollectionUtils.isEmpty(treeNode.getChildren())) {
                        treeNode.setChildren(new ArrayList<>());
                    }
                    treeNode.add(it);
                }
            }
        }
        return trees;
    }

    /**
     * 使用递归方法建树
     *
     * @param treeNodes
     * @param depth 需要递归的层级 深度
     * @return
     */
    public static <T extends TreeNode> List<T> buildByRecursive(List<T> treeNodes, Object root, Integer depth) {

        List<T> trees = new ArrayList<T>();
        int level = 1;
        for (T treeNode : treeNodes) {
            // 获取根节点(可以有多个根节点)
            if (root.equals(treeNode.getParentId())) {
                //     每个根节点递归添加子节点
                trees.add(findChildren(treeNode, treeNodes,level,depth));
                treeNode.setLevel(level);
            }
        }
        return trees;
    }

    /**
     * @Description: 递归查找子节点
     * @Author: 徐刘
     * @Date: 2020/12/7 9:57
     * @param treeNode
     * @param treeNodes
     * @param level 层级
     * @param depth
     * @Return: T
     */
    public static <T extends TreeNode> T findChildren(T treeNode, List<T> treeNodes, int level, Integer depth) {
        if(depth==null){
            depth = Integer.MAX_VALUE;
        }
        for (T it : treeNodes) {
            if (StringUtils.equalsIgnoreCase(treeNode.getId(), it.getParentId())) {
                if (treeNode.getChildren() == null) {
                    treeNode.setChildren(new ArrayList<>());
                }
                // 控制递归的 层级深度
                if(level>=depth){
                    return treeNode;
                }
                treeNode.add(findChildren(it, treeNodes, level +1, depth));
            }
            treeNode.setLevel(level);
            treeNode.setLeaf(treeNode.getChildren().size() <= 0);
        }
        return treeNode;
    }

}
  1. 递归构建 非树形结构 ,返回指定节点 下子孙节点 收集成一个list 集合

    商品分类 示例

   /**
	 * @desc 递归查找出该节点下面的子孙节点
	 * @return
	 * @author xuliu
	 * @date 2020/7/4 15:32
	 */

	public List<CPProductClass> buildByRecursive(List<CPProductClass> targetProductClasslist, String classid) {
		List<CPProductClass> trees = new ArrayList<>();
		Integer level = 1;
		findChildren(trees,targetProductClasslist,classid,level);
		return trees;
	}

	private List<CPProductClass> findChildren(List<CPProductClass> trees, List<CPProductClass> targetProductClasslist, String classid,Integer level) {
		if(targetProductClasslist !=null && targetProductClasslist.size()>0) {
			for (CPProductClass cpProductClass : targetProductClasslist) {
				if (cpProductClass.getParentclassid().equals(classid)) {
					findChildren(trees,targetProductClasslist,cpProductClass.getClassid(),level+1);
					cpProductClass.setClasslevel(level);
					trees.add(cpProductClass);
				}
			}
		}
		return trees;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值