易理解的线性列表转树形列表基础回顾

        在编码过程中,常会遇到类似文件目录、菜单展示的场景,时不时会遇到线性列表节点数据要转换成树形列表节点展示的情况,通常处理方法有递归、映射遍历,递归比较常见但是理解起来也有点绕,这里采用映射遍历的方式来构建直观好理解。

整体思路如下:

1.创建一个映射,将每个节点的ID映射到节点对象。

2.遍历节点列表,对于每个节点,查找其父节点,并将其添加到父节点的子节点列表中。

3.如果节点没有父节点(即它是根节点),我们将其添加到结果列表中。

首先,假设有节点Node类:

public class Node {
    public int id;
    public int parentId;
    public List<Node> children;

    public Node(int id, int parentId) {
        this.id = id;
        this.parentId = parentId;
        this.children = new ArrayList<>();
    }
}

然后,我们可以使用以下方法将线性列表转换为树形列表

public List<Node> convertListToTree(List<Node> nodes) {
    // 1.创建一个映射,将每个节点的ID映射到节点对象
    Map<Integer, Node> nodeMap = new HashMap<>();
    for (Node node : nodes) {
        nodeMap.put(node.id, node);
    }

    List<Node> result = new ArrayList<>();
    // 2.遍历节点列表,对于每个节点,
    for (Node node : nodes) {
        if (node.parentId == 0) {
            // 3.如果节点没有父节点(即它是根节点),我们将其添加到结果列表中
            result.add(node);
        } else {
            // 查找其父节点,并将其添加到父节点的子节点列表中。
            Node parent = nodeMap.get(node.parentId);
            if (parent != null) {
                parent.children.add(node);
            }
        }
    }
    return result;
}

整体思路是个直的,没有那么绕,主要借助Map先映射所有信息便于取,然后步骤parent.children.add(node)这个步骤由于对象是引用传递,不论是Map中映射的对象还是列表中的对象都是指向同一块内存确保了操作的节点是符合预期的节点。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值