我没有得到如何在树中找到第二大元素的逻辑。
public static int largestR(TreeNode<Integer> root){
if(root==null){
return Integer.MIN_VALUE;
}
int max=root.data;
for(int i=0;i<root.children.size();i++){
int n=largestR(root.children.get(i));
if(max<n){
max=n;
}
}
return max;
}
树不是二进制,节点可以有任意数量的子节点。
如果你能为我的解决方案提供代码算法,那就太棒了
感谢。
答案 0 :(得分:1)
你存储2个数字而不是1个。
这是我的实现(不确定语法是否正确):
public static void PushAnswer(int[] m, int value)
{
if (m[1] >= value) return;
if (m[0] >= value)
{
m[1] = value;
return;
}
m[1] = m[0];
m[0] = value;
}
public static void largestR(TreeNode<Integer> root, int[] answer)
{
if (root == null)
{
return;
}
PushAnswer(answer, root.data);
for (int i = 0; i < root.children.size(); i++)
{
largestR(root.children.get(i));
}
}
public static int[] getLargestR(TreeNode<Integer> root)
{
int[] answer = new int[2];
answer[0] = Integer.MIN_VALUE;
answer[1] = Integer.MIN_VALUE;
largestR(root, answer);
return answer;
}
答案 1 :(得分:0)
这是一种(效率不高但工作正常)的算法。您已经说明了如何找到列表中的最高元素。好。删除该元素。再次找到最高元素!
或者:使用某种排序算法对树进行排序,然后取第二个元素。
但仍然效率低下。最好是编写自己的方法,始终跟踪两个最大的元素。