java多叉树简单了解

  1. 生成树的几种方法
    1. 递归生成一棵树
    2. 依靠栈生成树结构
    3. 转为map生成树形结构
    4. 节点bean的代码

生成树的几种方法

递归生成一棵树

/**
 * 递归生成一棵树
 *
 * @param root 根节点
 * @param all  所有子节点
 * @author cuishilei
 * @date 2018/7/10
 */
public static void generateTreeRecursion(OrgTree root, List<OrgTree> all) {
    all.stream()
            .filter(node -> node.getParentId() != null && node.getParentId().equals(root.getId()))
            .forEach(node -> {
                root.addChild(node);
                generateTreeRecursion(node, all);
            });
}

依靠栈生成树结构

/**
 * 依靠栈生成树结构
 *
 * @param rootList 根结点
 * @param all      所有结点
 */
public static void getTreeByStack(List<OrgTree> rootList, List<OrgTree> all) {
    Stack<OrgTree> stack = new Stack<>();
    rootList.forEach(stack::push);
    while (!stack.isEmpty()) {
        OrgTree parentNode = stack.pop();
        List<OrgTree> childs = all.stream()
                .filter(p -> p.getParentId().equals(parentNode.getId()))
                .collect(Collectors.toList());
        parentNode.addChild(childs);
        childs.forEach(stack::push);
    }
}

转为map生成树形结构

/**
 * 转为map生成树形结构
 *
 * @param root
 * @param all
 * @author cuishilei
 * @date 2018/9/14
 */
public static void getTreeByMap(OrgTree root, List<OrgTree> all) {
    all.add(root);
    Map<Long, OrgTree> nodeMap = all.stream().collect(
            Collectors.toMap(OrgTree::getId, p -> p));
    for (OrgTree treeNode : nodeMap.values()) {
        if (nodeMap.containsKey(treeNode.getParentId())) {
            OrgTree parentNode = nodeMap.get(treeNode.getParentId());
            parentNode.addChild(treeNode);
        }
    }
}

节点bean的代码

@Data
public class OrgTree {

    /**
     * 节点id
     */
    private Long id;

    /**
     * 节点名称
     */
    private String label;

    /**
     * 父节点id
     */
    private Long parentId;


    private List<OrgTree> children = new ArrayList<>();

    /**
     * 添加子节点
     *
     * @param child
     * @author cuishilei
     * @date 2018/9/17
     */
    public void addChild(OrgTree child) {
        this.children.add(child);
    }

    /**
     * 批量添加子节点
     *
     * @param childs
     * @author cuishilei
     * @date 2018/9/17
     */
    public void addChild(List<OrgTree> childs) {
        if (childs != null) {
            this.children.addAll(childs);
        }
    }
}

TODO…


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 rockeycui@163.com

文章标题:java多叉树简单了解

文章字数:331

本文作者:崔石磊(RockeyCui)

发布时间:2018-09-13, 22:32:16

原始链接:https://cuishilei.com/java多叉树简单了解.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏