You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java实现树形结构列表中查询指定节点的所有父节点集合

实现思路
  • 通过深度优先遍历(DFS)扫描整棵树,遍历过程中记录当前遍历路径的父节点集合
  • 若当前遍历节点的子节点命中目标名称,直接返回「父节点路径 + 目标子节点」组成的集合
  • 单分支遍历未命中时,回溯移除当前节点的路径记录,继续遍历其他分支,全树未命中返回空集合
前置补充:MyNode类补全

原MyNode类为私有属性,需补充构造方法、Getter和Setter才能正常操作:

public class MyNode {
    private String name;
    private List<MyNode> nodeList;

    // 构造方法
    public MyNode(String name) {
        this.name = name;
    }

    // Getter & Setter
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<MyNode> getNodeList() {
        return nodeList;
    }

    public void setNodeList(List<MyNode> nodeList) {
        this.nodeList = nodeList;
    }
}
核心查找方法实现
import java.util.ArrayList;
import java.util.List;

public class NodeSearcher {
    public static List<MyNode> findNodePath(List<MyNode> root, String targetName) {
        List<MyNode> path = new ArrayList<>();
        // 遍历根节点层级
        for (MyNode rootNode : root) {
            // 优先判断根节点本身是否命中目标
            if (targetName.equals(rootNode.getName())) {
                path.add(rootNode);
                return path;
            }
            if (dfs(rootNode, targetName, path)) {
                return path;
            }
        }
        // 未找到返回空集合
        return new ArrayList<>();
    }

    private static boolean dfs(MyNode currentNode, String targetName, List<MyNode> path) {
        // 当前节点没有子节点,直接返回未找到
        if (currentNode.getNodeList() == null || currentNode.getNodeList().isEmpty()) {
            return false;
        }
        // 遍历当前节点的所有子节点
        for (MyNode child : currentNode.getNodeList()) {
            // 子节点命中目标
            if (targetName.equals(child.getName())) {
                path.add(currentNode);
                path.add(child);
                return true;
            }
            // 递归遍历子节点的下级
            if (dfs(child, targetName, path)) {
                // 子分支找到目标,把当前节点加到路径头部
                path.add(0, currentNode);
                return true;
            }
        }
        return false;
    }

    // 测试方法
    public static void main(String[] args) {
        // 初始化测试树结构
        List<MyNode> root = new ArrayList<>();
        MyNode a = new MyNode("a");
        List<MyNode> aList  = new ArrayList<>();
        aList.add(new MyNode("a1"));
        aList.add(new MyNode("a2"));
        a.setNodeList(aList);

        MyNode b = new MyNode("b");
        List<MyNode> bList  = new ArrayList<>();
        bList.add(new MyNode("b1"));
        bList.add(new MyNode("b2"));
        b.setNodeList(bList);

        root.add(a);
        root.add(b);

        // 测试查找b1
        List<MyNode> result = findNodePath(root, "b1");
        // 输出结果节点名验证
        for (MyNode node : result) {
            System.out.println(node.getName());
        }
    }
}
验证说明

运行测试代码后,输出内容为:

b
b1

和需求要求的返回集合完全一致,支持多级树结构的路径查找,比如存在b11是b1的子节点时,查找b11会返回[b, b1, b11]。


内容的提问来源于stack exchange,提问作者门心叼龙

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 22:06:03