遍历具有arraylist的树,该arraylist包含任意数量的子树作为其子树

时间:2019-04-29 10:53:53

标签: java arraylist tree

我正在做一些考试修订,并在过去的试卷上发现了这个问题:

enter image description here

enter image description here

首先,有人会实现这样的树吗?还是仅仅是考试问题?

其次,我对如何解决这个问题感到非常困惑。我想使用BFS或DFS,但它们仅适用于二叉树,而我对递归并不满意,因此也很难在其中使用。

我想出了这个可行的方法,但它确实很难看,在一般情况下,仅适用于这棵特定的树,是不可行的:

values_2017 %>% 
    left_join(meta) %>% 
    full_join(values_2014, by = "country_iso")
#> Joining, by = "country"
#> # A tibble: 3 x 6
#>   country      fit.x year.x country_iso year.y  fit.y
#>   <chr>        <dbl> <chr>  <chr>       <chr>   <dbl>
#> 1 Afghanistan  1.57  2017   AFG         2014    1.42 
#> 2 Angola      -1.69  2017   AGO         2014   -0.890
#> 3 Albania      0.866 2017   ALB         2014    0.163

values_2017 %>% 
    left_join(meta) %>% 
    left_join(values_2014, by = "country_iso")
#> Joining, by = "country"
#> # A tibble: 3 x 6
#>   country      fit.x year.x country_iso year.y  fit.y
#>   <chr>        <dbl> <chr>  <chr>       <chr>   <dbl>
#> 1 Afghanistan  1.57  2017   AFG         2014    1.42 
#> 2 Angola      -1.69  2017   AGO         2014   -0.890
#> 3 Albania      0.866 2017   ALB         2014    0.163

正如我在考试修订前所说的那样,任何帮助都将是很大的,而不是家庭作业。谢谢

1 个答案:

答案 0 :(得分:1)

这类问题可以通过递归解决:

public ArrayList<Integer> getLeafValues() {
    ArrayList<Integer> leafList = new ArrayList<>();
    getLeaves (this, leafList);
    return leafList;
}

public void getLeaves (Tree current, List<Integer> leafList)
{
    if (current.children.isEmpty()) {
        leafList.add(current.data);
    } else {
        for (Tree t : current.children) {
            getLeaves (t, leafList);
        }
    }
}

当您到达叶子(即没有子树的树)时,递归结束,在这种情况下,您将该叶子添加到List中。

如果当前节点有子节点,则对所有子节点递归调用该方法,以收集其子树的叶子。