c_cpp 给定二叉树,找到最大路径总和。路径可以在树中的任何节点处开始和结束。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 给定二叉树,找到最大路径总和。路径可以在树中的任何节点处开始和结束。相关的知识,希望对你有一定的参考价值。

//====================================================
// best version. clearer and eleganter
// return value is the max sum from an internal node to root
// 7 lines of code
int get_maxsum_till_root(TreeNode *root, int &final_max) {
    if(!root) return 0;
    int L = get_maxsum_till_root(root->left, final_max);
    int R = get_maxsum_till_root(root->right, final_max);
    int maxsum_pass_root = L + R + root->val;
    int maxsum_till_root = max(root->val, max(L, R) + root->val);
    final_max = max(final_max, max(maxsum_pass_root, maxsum_till_root));
    return maxsum_till_root;
}

//====================================================
// good concise solution
int dfs(TreeNode *root, int &final_max) {
    if(!root) return 0;
    int l = dfs(root->left, final_max);
    int r = dfs(root->right, final_max);
    int sum = root->val;
    if(l > 0) sum += l;
    if(r > 0) sum += r;
    final_max = max(final_max, sum);
    return max(l, r) > 0 ? max(l, r) + root->val : root->val;
}

//====================================================
// my initial solution, not sure if correct. large test time out.
void get_max_sum_from_root(TreeNode *root, int &max_sum) {
    if(!root) return;
    int left_max_sum = 0, right_max_sum = 0; // =0
    get_max_sum_from_root(root->left, left_max_sum);
    get_max_sum_from_root(root->right, right_max_sum);
    max_sum = max(root->val, max(left_max_sum, right_max_sum) + root->val);
}

void binary_tree_max_path_sum(TreeNode *root, int &max_sum) {
    if(!root) return;
    int left_max_sum = 0, right_max_sum = 0;
    get_max_sum_from_root(root->left, left_max_sum);
    get_max_sum_from_root(root->right, right_max_sum);
    int max_sum_path_pass_root = max(left_max_sum, right_max_sum) + root->val;
    int larger = max(root->val, max_sum_path_pass_root);
    int L = 0, R = 0;
    binary_tree_max_path_sum(root->left, L);
    binary_tree_max_path_sum(root->right, R);
    max_sum = max(max(L, R), larger);    
}



以上是关于c_cpp 给定二叉树,找到最大路径总和。路径可以在树中的任何节点处开始和结束。的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 给定二叉树和总和,确定树是否具有根到叶路径,以便沿路径添加所有值等于gi

Leetcode练习(Python):树类:第113题: 路径总和 II:给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。 说明: 叶子节点是指没有子节点的节点。

Leetcode练习(Python):树类:第113题: 路径总和 II:给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。 说明: 叶子节点是指没有子节点的节点。

113. 路径总和 II-二叉树的中序遍历

二叉树中的最大和路径

113. 路径总和 II