如何解决以不同的方式遍历一棵树
我目前已经这样做了:我试图遍历树,以便我可以将一个人下面的所有内容加起来。
每个人都有一个 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 举报,一经查实,本站将立刻删除。