我想在同一棵树上显示所有子级。因此,如果我有一棵这样的树:

            A
   B        C        D
 E   F    G   H    I   J


例如,级别3将返回E,F,G,H,I和J节点。我在TreeNode类中有一个方法,该方法返回给定节点的所有子代,所以我考虑做这样的事情:

static Collection<ITreeNode<IProduct>> getOnLevel(ITree<IProduct> tree, int level)
{
    Collection<ITreeNode<IProduct>> temp;
    int i;
    Iterator<ITreeNode<IProduct>> iterator = tree.getRoot().getChildren().iterator();
    for(i=0; i<=(level); i++)
    {
        while(iterator.hasNext())
        {
            ITreeNode<IProduct> elem = iterator.next();
            if(i == (level))
            {
                temp = elem.getChildren();
                return temp;
            }
        }
    }
    return tree.getRoot().getChildren();

}


但是后来我意识到我只是遍历了一级孩子,所以我可能必须以某种方式递归执行此操作?
在此先感谢,Amar!

最佳答案

您可以递归地执行它,也可以通过迭代来完成,这取决于您。

我发现递归解决方案稍微更容易阅读。它看起来像这样:

static Collection<ITreeNode<IProduct>> getOnLevel(
    ITree<IProduct> tree
,   int desiredLevel
) {
    List<ITreeNode<IProduct>> result = new ArrayList<>();
    findOneLevel(tree.getRoot(), desiredLevel, 0, result);
    return result;
}

static void findOnLevel(
    ITreeNode<IProduct> node
,   int desiredLevel
,   int currentLevel
,   List<ITreeNode<IProduct>> result
) {
    if (currentLevel == desiredLevel) {
        result.add(node);
        return;
    }
    Iterator<ITreeNode<IProduct>> iterator = node.getChildren().iterator();
    while(iterator.hasNext()) {
       getOneLevel(iterator.next(), desiredLevel, currentLevel+1, result);
    }
}


该方法非常简单:顶级方法列出了存储结果的列表,并调用了递归findOnLevel。递归方法检查我们是否已达到所需的级别,然后将当前节点添加到结果中。否则,我们将以递归调用方式遍历当前节点的所有子节点,并为新的当前级别传递currentLevel+1

09-30 11:44