Tree树状结构转list,获取从根节点到叶子节点中,每条路径上的所有集合

Tree对象结构:

public class B {
     private Integer id;
     private String label;
     private Integer nodeType;
     private List<B> children; //关键字段

     public Integer getId() { return id; }

     public void setId(Integer id) { this.id = id; }

     public String getLabel() { return label; }

     public void setLabel(String label) { this.label = label; }

     public Integer getNodeType() { return nodeType; }

     public void setNodeType(Integer nodeType) { this.nodeType = nodeType; }

     public List<B> getChildren() {
          return children;
     }

     public void setChildren(List<B> children) {
          this.children = children;
     }
}

方法:

注:结构必须为B类结构样式

/**
 * 迭代获取所有List集合
 * @param list  Tree型数据,
 * @param results 从根节点到当前data节点的 B 对象的集合(results集合中的所有children都为null)
 * @return
 */
private List<List<B>> recursiveList(List<B> list, List<B> results) {
    //声明返回对象
    List<List<B>> listList = new ArrayList<>();
    if (StringUtils.isNotEmpty(list)) {
        for (B tree : list) {
            //声明一个List,用来存放从根节点到当前节点 这一条路径上的B对象
            List<B> treeVOList = new ArrayList<>();
            treeVOList.addAll(results);//将前面路径上的B对象添加进 List
            B treeVO = new B();
            //把tree复制到treeVO
            BeanUtils.copyProperties(tree, treeVO);
            treeVO.setChildren(null);//把treeVO中的children赋值为null,tree中的不变
            treeVOList.add(treeVO);//将不包含children属性的临时对象放进 treeVOList

            //treeVOList 中已经保存完整了从根到当前节点一整条路径上的所有B对象了。
            //检查当前节点B对象的children属性,如果children为空,则表示当前节点为叶子节点,
            if (StringUtils.isEmpty(tree.getChildren())) {
                listList.add(treeVOList);
            } else {//不为空,说明当前节点不是叶子节点,把treeVOList传递给下一轮进行迭代
                List<List<B>> recursiveList = recursiveList(tree.getChildren(), treeVOList);
                //迭代结束对返回数据 recursiveList 进行追加保存,确保不会丢失
                listList.addAll(recursiveList);
            }
        }
    }
    return listList;
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用递归来遍历树,并得到每条根到叶子节点路径。以下是一个简单的示例代码: ```java public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public class BinaryTreePaths { public List<String> binaryTreePaths(TreeNode root) { List<String> paths = new ArrayList<>(); if (root == null) { return paths; } getPath(root, "", paths); return paths; } private void getPath(TreeNode node, String path, List<String> paths) { // 如果是叶子节点,将路径加入到路径列表 if (node.left == null && node.right == null) { paths.add(path + node.val); return; } // 如果不是叶子节点,继续遍历左右子树 if (node.left != null) { getPath(node.left, path + node.val + "->", paths); } if (node.right != null) { getPath(node.right, path + node.val + "->", paths); } } } ``` 在上面的代码,我们定义了一个 `TreeNode` 类表示树节点,其 `val` 表示节点的值,`left` 和 `right` 分别表示左子树和右子树。我们还定义了一个 `BinaryTreePaths` 类,其有一个 `binaryTreePaths` 方法用于获取每条根到叶子节点路径。在 `binaryTreePaths` 方法,我们首先判断根节点是否为空,如果为空则直接返回一个空的路径列表。接下来调用 `getPath` 方法,该方法用于递归遍历整棵树。如果当前节点叶子节点,将路径加入到路径列表,否则继续遍历左右子树。在遍历左右子树时,需要将当前节点的值加入到路径,并用箭头隔开。 使用示例代码: ```java TreeNode root = new TreeNode(1); root.left = new TreeNode(2); root.right = new TreeNode(3); root.left.right = new TreeNode(5); BinaryTreePaths solution = new BinaryTreePaths(); List<String> paths = solution.binaryTreePaths(root); for (String path : paths) { System.out.println(path); } ``` 输出结果: ``` 1->2->5 1->3 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值