您如何在Java中找到此树的路径数?

您如何在Java中找到此树的路径数?,java,search,tree,depth-first-search,breadth-first-search,Java,Search,Tree,Depth First Search,Breadth First Search,我正试图找到以这种方式表示的树的路径数: 1 4 2 4 3 4 -1 -1表示结束,每个数字表示下一个节点。每行都是一个节点,其编号以0开头。因此,在这个特定实例中,有3条路径:0>1>2>3>4>-1、0>4>-1和0>1>4>-1 import java.io.*; 导入java.util.*; 公共类探路者{ 公共静态void main(字符串[]args){ 扫描仪=新的扫描仪(System.in); ArrayList wholeList=新的ArrayList(); while

我正试图找到以这种方式表示的树的路径数:

1 4
2 4
3
4
-1
-1表示结束,每个数字表示下一个节点。每行都是一个节点,其编号以0开头。因此,在这个特定实例中,有3条路径:0>1>2>3>4>-1、0>4>-1和0>1>4>-1

import java.io.*;
导入java.util.*;
公共类探路者{
公共静态void main(字符串[]args){
扫描仪=新的扫描仪(System.in);
ArrayList wholeList=新的ArrayList();
while(scanner.hasNext()){
字符串输入=scanner.nextLine();
StringTokenizer st=新的StringTokenizer(输入“”);
ArrayList temp=新的ArrayList();
而(st.hasMoreTokens()){
临时添加(st.nextToken());
}
完整列表。添加(临时);
}
返回计数;
}
}

我建议您更改数组,使其包含整数而不是字符串。然后可以使用递归解决方案:

import java.io.*;
导入java.util.*;
公共类探路者{
公共静态void main(字符串[]args){
扫描仪=新的扫描仪(System.in);
List wholeList=new ArrayList();
while(scanner.hasNext()){
字符串输入=scanner.nextLine();
StringTokenizer st=新的StringTokenizer(输入“”);
List temp=new ArrayList();
而(st.hasMoreTokens()){
temp.add(Integer.valueOf(st.nextToken());
}
完整列表。添加(临时);
}
countRoutes(全列表,0);
系统输出打印项次(计数);
}
私有静态整数计数=0;
私有静态void countRoutes(列表树,int nodeFrom){
for(整数目标:tree.get(nodeFrom)){
如果(-1==目标){
计数++;
}否则{
countRoutes(树、目标);
}
}
}
}
如果要查看路由,可以稍微修改一下方法:

私有静态void打印路由(列表树、int-nodeFrom、字符串路由){
for(整数目标:tree.get(nodeFrom)){
如果(-1==目标){
计数++;
系统输出打印LN(路径+“->-1”);
}否则{
打印路由(树、目标、路由+“->”+目标);
}
}
}
并从主程序中调用它作为

printRoutes(全列表,0,“0”);
更新日期:2021年3月3日

更有效的方法是缓存从给定节点到端点的路径数:

private static int countRoutes(列表树,
int nodeFrom,
int[]路径编号)
{
如果(nodeFrom==-1){
返回1;
}
如果(路径编号[nodeFrom]>=0){
返回路径成员[nodeFrom];
}
整数和=0;
for(整数目标:tree.get(nodeFrom)){
sum+=countRoutes(树、目标、路径编号);
}
路径编号[nodeFrom]=总和;
回报金额;
}
然后在main方法中初始化数组pathsNumber并按如下方式调用此方法(-1表示我们还没有计算出通向此节点出口的路径数):

int[]pathsNumber=newint[wholeList.size()];
数组.fill(路径数,-1);
System.out.println(countRoutes(wholeList,0,pathsNumber));

014-1从哪里来?好吧,我从第0行到第1行到第4行,最后你画的示例树更像一棵树?readRow 0连接到:1 4,Row 1连接到:2 4,Row 2连接到:3,Row 3连接到:4,Row 4连接到:end(由-1表示)a非常混乱。图形的数字表示不清楚。对我来说,它看起来像0>1,0>4,1>2,1>4,2>3,3>4,4>1。B硬编码数据,而不是使用扫描仪。C我不知道dfs代码。非常感谢!!这是非常有帮助的。出于某种原因,这真的很慢。我正在尝试添加备忘录。但是,这仍然不好,因为在你原来的帖子中没有关于性能要求的信息。您可以尝试更新版本,它应该更快,因为它不会再次从已访问的节点构造路径。
import java.io.*;
import java.util.*;

public class PathFinder {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        ArrayList<ArrayList<String>> wholeList = new ArrayList<ArrayList<String>>();
        while (scanner.hasNext()) {
            String input = scanner.nextLine();
            
            StringTokenizer st = new StringTokenizer(input, " ");

            ArrayList<String> temp = new ArrayList<String>();
            while(st.hasMoreTokens()) {
                temp.add(st.nextToken());
            }
            wholeList.add(temp);
        }

        return count;
    }
}