返回节点列表 Java-Parent 中的树可以有多个子节点

问题描述 投票:0回答:3

我正在尝试编写java代码来返回树中的节点列表。 这棵树看起来像this

节点类是

class Node{
 String label;
 List<Node> children;
}

我正在尝试这种方式。但无法理解如何编写循环来遍历。

    public List<Node> returnAllNodes(Node node){
    List<Node> listOfNodes = 
        new ArrayList<Node>();
    boolean iterationCompleted = false;
    if(node==null){
        return null;
    }
    while(!iterationCompleted){
    if(node.getChildren()==null){
        listOfNodes.add(node);
                    break;    
    }
            else{
               //
            }
    }
    return null;
    //return traverseAndReturnAllNodes(node.getChildren().get(0));
}

请帮忙。

java data-structures
3个回答
14
投票

如果您确定该结构是一棵树(一个节点不能有多个父节点),这将按深度优先顺序列出节点:

public static List<Node> returnAllNodes(Node node){
    List<Node> listOfNodes = new ArrayList<Node>();
    addAllNodes(node, listOfNodes);
    return listOfNodes;
}

private static void addAllNodes(Node node, List<Node> listOfNodes) {
    if (node != null) {
        listOfNodes.add(node);
        List<Node> children = node.getChildren();
        if (children != null) {
            for (Node child: children) {
                addAllNodes(child, listOfNodes);
            }
        }
    }
}

如果节点可以有多个父节点,请将addAllNodes的第一行更改为:

    if (node != null && !listOfNodes.contains(node)) {

广度优先算法是这样的:

public static List<Node> returnAllNodes(Node node){
    List<Node> listOfNodes = new ArrayList<Node>();
    if (node != null) {
        listOfNodes.add(node);
        for(int i = 0; i < listOfNodes.size(); ++i) {
            Node n = listOfNodes.get(i);
            List<Node> children = n.getChildren();
            if (children != null) {
                for (Node child: children) {
                    if (!listOfNodes.contains(child)) {
                        listOfNodes.add(child);
                    }
                }
            }
        }
    }
    return listOfNodes;
}

4
投票

0
投票

作为 Maurice Perry 对基于 DFS 的方法的答案的增强。如果单独需要子节点(因为父节点已知),则可以将子节点单独添加为

,而不是始终将节点添加到 listOfNodes
public static List<Node> returnAllNodes(Node node){
    List<Node> listOfNodes = new ArrayList<Node>();
    addAllNodes(node, listOfNodes);
    return listOfNodes;
}

private static void addAllNodes(Node node, List<Node> listOfNodes) {
    if (node != null) {
        List<Node> children = node.getChildren();
        if (children != null) {
            for (Node child: children) {
                listOfNodes.add(child);
                addAllNodes(child, listOfNodes);
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.