所以我构建了这个具有1 .. *节点的树,其中每个节点都有一个列表,其本身可以有1个*节点。
树的前三个层次我可以建立得很好,但如果我不编码所有非常愚蠢的级别,那么它将不会工作得更多。解决方案当然是使用某种递归方法和BFS。
基本上,在我的TreeBuilder类中,我希望能够调用tree.getNodesAtDepth(depth))
并获取该深度的所有节点的列表。问题是我不明白如何实现getNodesAtDepth(depth)
方法。
我找到的所有示例都是二叉树。另一种方法是让addChild方法采用深度参数,这样我就可以指定插入子项的深度。
最后,这就是我想要的: 我有一棵树根。根有一个列表,其中有4个子节点。我想要4个孩子。为每个孩子生成三个节点。因此,0岁儿童有3个孩子,1个孩子有3个孩子,孩子3个有3个孩子,4个孩子有3个孩子。等等
也许一种可能的倾向是在每个节点上都有一个level属性并搜索该节点然后返回它的父节点。因为它的父母应该有一个搜索节点的所有节点的列表。
答案 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);
}
}
}
这里树节点递归地遍历到预期的水平