在二叉树中查找最大总和叶到根路径

时间:2014-01-16 14:49:03

标签: c# algorithm multidimensional-array tree

我创建了一个递归函数来计算二叉树的最大路径。我得到了反馈,它不起作用,但据我测试它提供了正确的结果。有谁可以帮助我吗?

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

2 个答案:

答案 0 :(得分:3)

您的算法中存在严重错误:您只需要遍历“金字塔”一次,并根据下一个结果选择基于案例的案例,而无需查看基础节点。 为了说明您正在做的事情,请考虑以下金字塔:

     1
   2   3
311  6    3

假设您从1开始,将执行以下操作:

  1. 查看底层节点(2和3)的最大值。
  2. 转到下一个节点(3)并重复。
  3. 你的算法将返回10(1 + 3 + 6),而我的例子中的最大值是311 + 2 + 1,因为它没有向前看。

    为了确定最佳路径,您需要一个策略,而不是前进一步。

    修改:查看Euler project #18 approach以获取更多提示。

答案 1 :(得分: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];
}