如何在Java中计算嵌套数据结构中的叶节点?

如何在Java中计算嵌套数据结构中的叶节点?,java,algorithm,data-structures,nodes,Java,Algorithm,Data Structures,Nodes,我有一个这样的结构,我们称之为Box对象 Box--+---Box----Box | +---Box-+--Box | +--Box | +--Box 我试图向top box对象询问叶节点框的列表,在本例中是3个box对象 box对象在名为children的Vector类型的实例变量中有其子对象的列表 孩子的数量可以是无限的 我一直在尝试编写一个递归方法来实现这一点,但没

我有一个这样的结构,我们称之为Box对象

Box--+---Box----Box
     |
     +---Box-+--Box
             |
             +--Box
             |
             +--Box
我试图向top box对象询问叶节点框的列表,在本例中是3个box对象

box对象在名为children的Vector类型的实例变量中有其子对象的列表

孩子的数量可以是无限的


我一直在尝试编写一个递归方法来实现这一点,但没有成功。

实现这一点的一种方法是递归遍历结构。其思路如下:

  • 空树中没有叶节点
  • 在一棵根为r且没有子树的树中,r是唯一的叶子

  • 在根为r的树中,如果r有子树,那么树的叶子就是这些子树的叶子
  • 您可以使用以下伪代码编写递归遍历:

    void findChildren (Box current, List<Box> found) {
        /* Case 1. */
        if (current == null) return;
    
        /* Case 2. */
        if (current.children.isEmpty()) {
            found.add(current);
            return;
        }
    
        /* Case 3. */
        for (Box child: current.children)
            findChildren(child, found);
    }
    
    void findChildren(当前框,找到列表){
    /*案例1*/
    if(current==null)返回;
    /*案例2*/
    if(current.children.isEmpty()){
    找到。添加(当前);
    返回;
    }
    /*案例3*/
    用于(框子项:current.children)
    findChildren(child,find);
    }
    

    希望这有帮助

    我已经有一段时间没有使用Java了,所以我确信这段代码有很多语法错误,我希望没有人会因此而给我打分;只是想给你一些算法的想法。希望能有所帮助:

    vector<Box> getLeaves(Box root)
    {
        vector<Box> tempList;    //vector to hold nodes to check
        vector<Box> tempList2;   //vector to hold nodes' children
        vector<Box> leafList;
        bool goflag = true;
    
        tempList.add(root);
    
        while(goflag){
            for(int i = 0; i < tempList.size; i++){
                if(tempList[i].children.isEmpty()){
                    leafList.add(tempList[i]);
                }
                else{
                    //add all children to tempList2
                    for(int c = 0; c < tempList[i].children.size; c++){
                        tempList2.add(tempList[i].children[c])
                }
            }
            if(tempList2.isEmpty()) //no more childs
                goflag = false;
            else
                tempList = tempList2;
            tempList2.clear();
        }
        return leafList;
    }
    
    vector getLeaves(框根)
    {
    vector tempList;//用于保存要检查的节点的向量
    vector tempList2;//用于保存节点子节点的向量
    向量叶表;
    bool-goflag=true;
    添加(根);
    while(goflag){
    for(int i=0;i

    它遍历所有节点,将子节点添加到下一个要检查的列表中,并将叶子添加到要返回的列表中。

    有几种方法可以编写这样的函数

    • 定义一个助手函数,该函数接受一个节点和一个包含节点的可变队列
    • 在该helper函数中,检查提供的节点的子节点是否为空。如果为空,请将该节点添加到队列中,然后返回
    • 相反,如果提供的节点有任何子节点,则为每个子节点调用一次helper函数,并传递子节点和相同的队列引用
    • 在顶层,创建一个空队列,并调用helper函数,传入根节点和队列
    • 当helper函数返回时,队列将按照叶的发现顺序包含所有叶

    另一种方法使用相同的深度优先遍历,但函数将返回它发现的叶子列表。这些列表需要为每一组探索的同级元素组合起来,在每个函数调用返回时备份树。

    到目前为止,您有什么?三个长方体对象?不是有四个叶子吗?“在根为r的树中,如果r有子树,那么树的叶子就是这些子树的叶子。"在这种情况下,是的。但我肯定会有根的子代会有子代的情况。我没有-1顺便说一句。那个人应该留下自己的评论。@Nicklamort:这是递归规则,是真的。因为你进入子代,他们会再次应用该规则。Falmari,我理解,但这并不意味着只有子代是“根”的孩子。无论谁投了反对票,我都希望能解释一下为什么这是不正确的。如果我犯了错误,我真的很想知道它是什么;这对我来说似乎是正确的。此外,如果问题是我解释得不好,我想知道如何改进答案,使它更有用。我在这里因为我真的很喜欢帮助别人,如果有什么我能做的可以改进的,我很乐意听你说。是的,这已经足够接近了。当我开始输入这个答案时,我还没有注意到另一个答案。