2017-01-05 2 views
0

Я не получаю логику того, как найти второй по величине элемент в дереве.Как найти второе по величине значение в дереве

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

Дерево не является бинарным, у узла может быть любое количество детей.

Было бы замечательно, если вы можете дать мне алгоритм кода для ее решения

Спасибо.

+5

Ну, вы знаете, как получить наибольшее значение в дереве? Это почти то же самое, что и вы, за исключением того, что вы отслеживаете 2 самых больших значения, а не только 1. –

+0

Я знаю, как получить наибольшее значение. – nishant

+0

Если вы поделитесь своим кодом, показывающим, как вы сделали это для самого большого, мы можем предложить, как изменить его на 2-й по величине. –

ответ

1

Вы MEED магазин 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; 
} 
+0

Это в основном правильно. Хорошо сделано, хотя я лично не буду использовать массив, но просто передаю 2 переменные, так как это лучше для читаемости. –

0

Вот (не очень эффективный, но рабочий) алгоритм. Вы заявили, что знаете, как найти наивысший элемент в списке. Хорошо. Удалите этот элемент. Найти наивысший элемент снова!

Альтернативно: Сортируйте дерево, используя алгоритм сортировки и возьмите второй элемент.

Все еще неэффективен. Лучше всего написать свой собственный метод, который всегда отслеживает два самых больших элемента.

+0

Спасибо. но не могли бы вы рассказать мне, как это сделать? – nishant

+0

Ваш отредактированный код в вопросе неверен, он будет смотреть только на верхний уровень дерева, вам нужно использовать рекурсию, чтобы найти всех детей. Но в текущем состоянии кода вы добавили бы добавочную переменную: 'max2', из которой логика вы можете определить для себя;) В основном, когда у ребенка больше текущего max: max, что новый max и установлен старый max равно 'max2'. –

+0

мой код не будет работать для нахождения самого большого элемента? – nishant

Смежные вопросы