/** da' come risultato il massimo dei pesi dei cammini dalla radice a una foglia, dove il peso del cammino e' la somma dei valori degli elementi dei nodi lungo il cammino */ int maxPath(Albero a) { int sx,dx; if (a == NULL) return 0; //ricorro per calcolare massimo su sx e dx sx = maxPath(a->left); dx = maxPath(a->right); //ritorno valore, per poterlo usare ricorrendo return a->element + max(sx,dx); }
void maxPath(TreeNode *root, int &max_ends_here, int &max_overall) { if (root == NULL) { max_ends_here = INT_MIN; max_overall = INT_MIN; return; } int l_max_half, r_max_half, l_max_overall, r_max_overall; maxPath(root->left, l_max_half, l_max_overall); maxPath(root->right, r_max_half, r_max_overall); max_ends_here = max(0, max(l_max_half, r_max_half)) + root->val; int max_through_here = max(0, l_max_half) + max(0, r_max_half) + root->val; max_overall = max(max_through_here, max(l_max_overall, r_max_overall)); }
pair<int, int> maxPath(TreeNode* root) { pair<int, int> ans = make_pair(root->val, root->val); if (root ->left != nullptr) { auto tans = maxPath(root->left); ans.first = max(ans.first, ans.second + tans.second); ans.second = max(ans.second, tans.second + root->val); ans.first = max(ans.first, tans.first); } if (root ->right != nullptr) { auto tans = maxPath(root->right); ans.first = max(ans.first, ans.second + tans.second); ans.second = max(ans.second, tans.second + root->val); ans.first = max(ans.first, tans.first); } ans.first = max(ans.first, ans.second); return ans; }
int maxPathSum(TreeNode *root) { int max_overall, max_ends_here; maxPath(root, max_ends_here, max_overall); return max_overall; }
int maxPathSum(TreeNode* root) { auto ans = maxPath(root); return ans.first; }