Beispiel #1
0
  /** 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));
 }
Beispiel #3
0
 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;
 }
Beispiel #5
0
 int maxPathSum(TreeNode* root) {
     auto ans = maxPath(root);
     return ans.first;
 }