如何在树中找到第二大值

时间:2017-01-05 12:19:58

标签: java algorithm data-structures tree

我没有得到如何在树中找到第二大元素的逻辑。

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;
}

树不是二进制,节点可以有任意数量的子节点。

如果你能为我的解决方案提供代码算法,那就太棒了

感谢。

2 个答案:

答案 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)

这是一种(效率不高但工作正常)的算法。您已经说明了如何找到列表中的最高元素。好。删除该元素。再次找到最高元素!

或者:使用某种排序算法对树进行排序,然后取第二个元素。

但仍然效率低下。最好是编写自己的方法,始终跟踪两个最大的元素。