Spoilery
Jeśli chciał rozwiązać ten problem, nie należy odczytać kodu.
Jeden sposób można go rozwiązać jest włączenie danych do drzewa (wykres faktycznie) i napisać rekurencyjny algorytm, który będzie znaleźć maksymalną drogę przez drzewa poprzez zmniejszenie drzewa na mniejsze poddrzew (do ciebie mieć drzewo z tylko jednym węzłem) i zaczynać od tego miejsca.
bardzo podoba mi algorytmów rekurencyjnych i pracy z drzew, więc poszedł do przodu i napisał program, aby to zrobić:
#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;
}
on wydrukowany
7 -> 3 -> 8 -> 7 -> 5
ścieżka dodana do 30
Co masz na myśli przez "maksymalnej drogi"? Przejście od korzenia do węzła liścia, który napotyka najbardziej pośrednie węzły? –
... ścieżka o maksymalnej łącznej sumie? –
@HunterMcMillen widocznie ścieżka, przez którą liczby sumują się do największej wartości –