与列表的树上的BFS

时间:2017-09-07 07:31:19

标签: java tree breadth-first-search

所以我构建了这个具有1 .. *节点的树,其中每个节点都有一个列表,其本身可以有1个*节点。

树的前三个层次我可以建立得很好,但如果我不编码所有非常愚蠢的级别,那么它将不会工作得更多。解决方案当然是使用某种递归方法和BFS。

基本上,在我的TreeBuilder类中,我希望能够调用tree.getNodesAtDepth(depth))并获取该深度的所有节点的列表。问题是我不明白如何实现getNodesAtDepth(depth)方法。

我找到的所有示例都是二叉树。另一种方法是让addChild方法采用深度参数,这样我就可以指定插入子项的深度。

最后,这就是我想要的: 我有一棵树根。根有一个列表,其中有4个子节点。我想要4个孩子。为每个孩子生成三个节点。因此,0岁儿童有3个孩子,1个孩子有3个孩子,孩子3个有3个孩子,4个孩子有3个孩子。等等

也许一种可能的倾向是在每个节点上都有一个level属性并搜索该节点然后返回它的父节点。因为它的父母应该有一个搜索节点的所有节点的列表。

2 个答案:

答案 0 :(得分:0)

试试这个方法:

static void getNodesAtDepth(Node root, int currentLevel, int level, List<Node> nodes) {
    if(root == null) return;
    if(level == 0) {
        nodes.add(root);
        return;
    }

    if(currentLevel + 1 == level) {
        if(root.getNodeList() != null) {
            nodes.addAll(root.getNodeList());
        }
    }

    if(currentLevel < level) {
        if(root.getNodeList() != null) {
            for(Node node : root.getNodeList()) {
                getNodesAtDepth(node, currentLevel + 1,  level , nodes);
            }
        }
    }
}

如何使用它:

List<Node> nodeList = new LinkedList<>();
getNodesAtDepth(root, 0, 2, nodeList);

root当然是你树的根。 nodeList会将所有节点存储在所需的级别(在我的情况下,它是2)。第二个参数始终是0,(用于跟踪当前级别的那个)

答案 1 :(得分:0)

如果我假设您的类树结构是:

class Tree {
    List<Tree> children
    ...
}

然后你可以递归遍历树,直到找到预期的深度:

void recursivelyCollectNodesAtDepth(int depth,
                                    List<Tree> nodesAtDepth,
                                    Tree tree,
                                    int currentDepth) {

    if (tree == null) {
        return;
    }

    if (depth == 0) {
        nodesAtDepth.add(tree);
    } else if (currentDepth + 1 == depth) {
        // add children to the node list when expected depth is reached
        if (tree.getChildren() != null) {
            nodesAtDepth.addAll(tree.getChildren());
        }
    } else if (currentDepth < depth) {
        // iterate and recursively travers through child nodes
        for (Tree childTree : tree.getChildren()) {
            recursivelyCollectNodesAtDepth(depth,
                    nodesAtDepth,
                    childTree,
                    currentDepth + 1);
        }
    }
}

这里树节点递归地遍历到预期的水平