我创建了一个递归函数来计算二叉树的最大路径。我得到了反馈,它不起作用,但据我测试它提供了正确的结果。有谁可以帮助我吗?
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;
}
答案 0 :(得分:3)
您的算法中存在严重错误:您只需要遍历“金字塔”一次,并根据下一个结果选择基于案例的案例,而无需查看基础节点。 为了说明您正在做的事情,请考虑以下金字塔:
1
2 3
311 6 3
假设您从1开始,将执行以下操作:
你的算法将返回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];
}