Spoilers
Nếu bạn muốn giải quyết vấn đề này cho mình, đừng đọc mã.
Một cách để bạn có thể giải quyết nó là để biến dữ liệu vào một cây (đồ thị thực) và viết một thuật toán đệ quy sẽ tìm ra con đường tối đa qua cây bằng cách giảm cây vào subtrees nhỏ hơn (cho đến khi bạn có một cây chỉ với một nút) và bắt đầu đi lên từ đó.
Tôi thực sự thích các thuật toán đệ quy và làm việc với cây, vì vậy tôi đã đi trước và đã viết một chương trình để làm điều đó:
#include <algorithm>
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
struct node {
node(int i, node* left = NULL, node* right = NULL) : data(i), left(left), right(right) { }
node* left, *right;
int data;
};
/*
tree:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
*/
std::vector<node*> maxpath(node* tree, int& sum) {
if (!tree) {
sum = -1;
return std::vector<node*>();
}
std::vector<node*> path;
path.push_back(tree);
if (!tree->left && !tree->right) {
sum = tree->data;
return path;
}
int leftsum = 0, rightsum = 0;
auto leftpath = maxpath(tree->left, leftsum);
auto rightpath = maxpath(tree->right, rightsum);
if (leftsum != -1 && leftsum > rightsum) {
sum = leftsum + tree->data;
copy(begin(leftpath), end(leftpath), back_inserter<vector<node*>>(path));
return path;
}
sum = rightsum + tree->data;
copy(begin(rightpath), end(rightpath), back_inserter<vector<node*>>(path));
return path;
}
int main()
{
// create the binary tree
// yay for binary trees on the stack
node b5[] = { node(4), node(5), node(2), node(6), node(5) };
node b4[] = { node(2, &b5[0], &b5[1]), node(7, &b5[1], &b5[2]), node(4, &b5[2], &b5[3]), node(4, &b5[3], &b5[4]) };
node b3[] = { node(8, &b4[0], &b4[1]), node(1, &b4[1], &b4[2]), node(0, &b4[2], &b4[3]) };
node b2[] = { node(3, &b3[0], &b3[1]), node(8, &b3[1], &b3[2]) };
node n(7, &b2[0], &b2[1]);
int sum = 0;
auto mpath = maxpath(&n, sum);
for (int i = 0; i < mpath.size(); ++i) {
cout << mpath[i]->data;
if (i != mpath.size() - 1)
cout << " -> ";
}
cout << endl << "path added up to " << sum << endl;
}
Nó in
7 -> 3 -> 8 -> 7 -> 5
con đường bổ sung lên đến 30
Ý anh là gì bởi "con đường tối đa"? Một traversal từ gốc đến một nút lá mà gặp các nút trung gian nhất? –
... đường dẫn có tổng số tiền tối đa? –
@HunterMcMillen dường như là con đường mà qua đó các con số cộng với giá trị lớn nhất –