以不同的方式遍历一棵树

如何解决以不同的方式遍历一棵树

我目前已经这样做了:我试图遍历树,以便我可以将一个人下面的所有内容加起来。

每个人都有一个 int 点和一个 Friends 的 ArrayList。想象一下,树上的每个人都在一个团队中。所以最大的团队是整棵树,但B也带领着D和E的一个子团队,而C则带领着F。

我想计算每支球队的最大平均分。我当前的代码尝试迭代地遍历树,但我不知道如何获取每个团队而不是整个团队的总和。我是否需要递归执行此操作?

       A
     /   \
    B     C
  /  \    |     
 D    E   F
public static void main(String[] args) {
    Person a = new Person(5);
    Person b = new Person(3);
    Person c = new Person(2);
    ArrayList<Person> list1 = new ArrayList<>();

    list1.add(b);
    list1.add(c);
    a.friends = list1;

    mostPoints(a);
}


public static Employee mostPoints(Person start) {
    int topFriend = 1;

    for (Person person: start.friends) {
        if (person.friends.size() > 1) {
            topFriend++;
        }
    }
    System.out.println(topFriend);

    int total = 0;
    for (Person under: start.friends) {
        total = total + under.points;
    }

    return total / start.friends.size();
}

解决方法

最简单但效率最低的方法:遍历树,平均每个节点(调用mostPoints方法),将其放入一个数组中,并取其最大的。

public class StackOverflowSolve {

private List<Integer> list = new ArrayList<>();

public int slove(Person person) {
    dfs(person);
    return list.stream().reduce(Integer::max).get();
}

public void dfs(Person person) {
    if (person == null) {
        return;
    }
    list.add(average(person));
    if (person.friends != null && person.friends.size() > 0) {
        person.friends.forEach(child -> {
            dfs(child);
        });
    }
}

public int average(Person person) {
    return sum(person) / teamSize(person);
}

public int sum(Person person) {
    if (person == null) {
        return 0;
    }
    if (person.friends == null || person.friends.size() == 0) {
        return person.points;
    }
    int friendPonits = 0;
    for (Person friend : person.friends) {
        friendPonits += sum(friend);
    }
    return friendPonits + person.points;
}

public int teamSize(Person person) {

    if (person == null) {
        return 0;
    }
    if (person.friends == null || person.friends.size() == 0) {
        return 1;
    }
    int friendSize = 0;
    for (Person friend : person.friends) {
        friendSize += teamSize(friend);
    }
    return friendSize + 1;
}


private static class Person {
    public int points;
    public List<Person> friends;
}

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?