2014-01-16 8 views
2

Я создал рекурсивную функцию для вычисления максимального пути двоичного дерева. Я получил обратную связь, что он не работает, но, по моему тесту, он дает правильный результат. Может кто-то мне помочь, пожалуйста?Найти максимальную сумму листа в корневой путь в двоичном дереве

private long PathSum(int row, int column, Pyramid pyramid) 
{ 
    // Base case, stop recurse when first row is reached. 
    if (row == 0) return pyramid[row, column]; 

    // Set level to the current cell and add to the end result. 
    long value = pyramid[row, column]; 

    // Continue to the next row. 
    if (row != 0) 
    { 
     // Continue to the next left level. 
     long left = pyramid[row - 1, column]; 

     // Continue to the next right level. 
     long right = pyramid[row - 1, column + 1]; 

     // Get the highest of the left and right. 
     long highest = Math.Max(left, right); 

     // Get the index of the hightest path. 
     int nextColumn = highest == left ? column : column + 1; 

     // Recurse to the next level and add results together. 
     value += GetTotal(row – 1, nextColumn, pyramid); 
    } 
    // Return result to the caller. 
    return value; 
} 
+1

Задать вопрос, что они ожидали, что у них есть, и попытаться отладить его. Также это выглядит подозрительно для c 'Math.Max ​​(слева, справа)'. – luk32

+0

Это не похоже на C-код - больше похож на Java или C#. Что это за язык? Что такое «пирамида»? – dasblinkenlight

+0

Я спросил, но они не могут сказать мне больше. Как я уже сказал, я протестировал его, и для меня все хорошо. – Doro

ответ

3

У вас есть критическая ошибка в вашем алгоритме: вы ходите только через «пирамиду» один раз и выберите случай, основанный на основе следующего результата, не глядя на нижележащих узлах. Для того, чтобы проиллюстрировать то, что вы делаете, рассмотрим следующую пирамиду:

 1 
    2 3 
311 6 3 

Предполагая, что вы начинаете в 1, то будет выполнено следующее:

  1. Посмотрите на макс из основных узлов (2 и 3).
  2. Спуститесь к следующему узлу (3) и повторите.

Ваш алгоритм вернет 10 (1 + 3 + 6), в то время как максимальное значение в моем примере равно 311 + 2 + 1, потому что оно не смотрит в будущее.

Для определения наилучшего пути вам требуется стратегия, чтобы смотреть дальше, чем на один шаг вперед.

Редактировать: посмотреть на Euler project #18 approach для получения дополнительных советов.

+0

Спасибо, Бас, я только что решил 2-й проект Эйлера. Итак, я должен пойти посмотреть на 18-е. – Doro

+0

Привет, Не могли бы вы рассказать мне, что является неправильной? [email protected] – Doro

0

Я думаю, что вы описываете не двоичное дерево, а пирамиду чисел, и проблему лучше всего решить с помощью динамического программирования вместо обхода дерева. Вот пример кода для динамического программирования. Он не составлен, и я не знаю, например, C#:

private long DP(int maxRow, Pyramid pyramid) 
{ 
    int maxColumn = maxRow; 
    Pyramid result; 
    clear_pyramid(result); 
    for (int j=0; i<maxColumn; i++) { 
     result[0, j] = pyramid[0, j]; 
    }  
    for (int i=1; i<maxRow; i++) { 
     for (int j=0; j<maxColumn-i; j++) { 
      result[i,j] = Math.max(result[i-1,j], result[i-1,j+1]) + pyramid[i,j]; 
     }  
    } 
    return result[maxRow-1, 0]; 
} 
+1

Пирамида - фактически тип двоичного дерева. – Servy

+0

О, почему, я думаю, пирамида, которую вы упомянули, имеет 2^n чисел на уровне n? Если мы говорим о пирамиде с n + 1 числами на уровне n, то я думаю, что это не дерево. Например, мы имеем 1 на уровне 0, 2 3 на уровне 1, 4 5 6 на уровне 2, затем оба 2 и 3 связаны как с 1, так и с 5, что означает, что между ними есть два пути, и это противоречит определению дерева. – lindenrovio

+1

@justinzhang Дерево - это просто график, который не имеет циклов. Тот факт, что узел является дочерним элементом двух разных узлов, не означает, что он не является деревом.Для того чтобы не быть деревом, узел должен был бы иметь своего предка (или самого себя) в качестве своего потомка, создавая таким образом цикл. – Servy

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