Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在二叉树的同一级别上获取所有子级_Java_Tree_Iterator_Treenode - Fatal编程技术网

Java 在二叉树的同一级别上获取所有子级

Java 在二叉树的同一级别上获取所有子级,java,tree,iterator,treenode,Java,Tree,Iterator,Treenode,我想在树的同一级别上显示所有子级。如果我有一棵这样的树: A B C D E F G H I J static Collection<ITreeNode<IProduct>> getOnLevel(ITree<IProduct> tree, int level) { Collection<ITreeNode<IProduct>> temp;

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

            A
   B        C        D
 E   F    G   H    I   J
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(); 

}
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()) {
       findOnLevel(iterator.next(), desiredLevel, currentLevel+1, result);
    }
}
例如,级别3将返回E、F、G、H、I和J节点。我在
TreeNode
类中有一个方法,它返回给定节点的所有子节点,所以我考虑这样做:

            A
   B        C        D
 E   F    G   H    I   J
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(); 

}
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()) {
       findOnLevel(iterator.next(), desiredLevel, currentLevel+1, result);
    }
}
static Collection getOnLevel(ITree树,int级)
{
采集温度;
int i;
迭代器迭代器=tree.getRoot().getChildren().Iterator();

对于(i=0;i您可以递归地或通过迭代来执行,这取决于您

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

            A
   B        C        D
 E   F    G   H    I   J
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(); 

}
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()) {
       findOnLevel(iterator.next(), desiredLevel, currentLevel+1, result);
    }
}
静态集合getOnLevel(
柠檬树
,int-desiredLevel
) {
列表结果=新建ArrayList();
findOneLevel(tree.getRoot(),desiredLevel,0,result);
返回结果;
}
静态空洞水平(
三叉节
,int-desiredLevel
,int currentLevel
,列出结果
) {
如果(currentLevel==desiredLevel){
结果.添加(节点);
返回;
}
迭代器迭代器=node.getChildren().Iterator();
while(iterator.hasNext()){
findOnLevel(迭代器.next(),desiredLevel,currentLevel+1,结果);
}
}

这种方法非常简单:顶级方法创建一个列表来存储结果,并调用递归的
findOnLevel
。递归方法检查我们是否达到了所需的级别,如果达到了,则将当前节点添加到结果中。否则,我们将在递归调用中遍历当前节点的所有子节点passing
currentLevel+1
用于新的当前级别。

对树进行BFS遍历。@n是的,我理解二叉树上BFS遍历的概念,但如果树可以有多个子树,而不仅仅是两个子树,会是什么样子?如果是二叉树,我可以轻松递归调用同一个函数两次,但如果有可能,我该怎么做有更多的孩子吗?