zoukankan      html  css  js  c++  java
  • [leetcode]Binary Tree Maximum Path Sum

    /**
    * Definition for binary tree
    * struct TreeNode {
    * int val;
    * TreeNode *left;
    * TreeNode *right;
    * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    * };
    */
    class Solution {
    public:
    /*
    这里的node_max_sum要注意,它的返回值不是以传入的参数root为根的子树的max path sum!
    而是指从root出发的路径的最大和,明白这一点很重要,否则这个代码写不出来。。别人也看不懂。
    明确这一点之后,接着来分析,可以设置一个最大值的引用,在每次递归中判断更新最大值,也可以直接定义一个全局变量。
    总之,记这个值为max_path_sum。
    在获得从root->left和root->right出发的路径的max sum(记为left_sum和right_sum)之后,函数的返回值应该是:
    root->val,left_sum, right_sum之中的最大值。
    然后,由于题目要求求树中所有路径的最大和,所以要考虑路径经过root的情况,所以需要把max_path_sum和left_sum+right_sum+root->val的值,以及从root出发的路径的sum最大值相比较,将max_path_sum更新为这些值中的最大值。
    此题折磨了我很长时间。。需要仔细体会。

    所谓的最大和,就是从根节点出发的路径以及经过根节点的路径的和的最大值,再与之前求得的除根节点加入之前的最大值相比,较大的那个,
    就是所要求的那个最大和,这是本题的基本思路。


    */
    int max_path_sum = INT_MIN;
    int node_max_sum(TreeNode *root)
    {
    if (root == NULL)
    {
    return 0;
    }

    int left_sum = node_max_sum(root->left);
    int right_sum = node_max_sum(root->right);

    int tmp = max(root->val, max(left_sum+(root->val), right_sum+(root->val)));
    int tmp1 = max(root->val+left_sum+right_sum, tmp);

    max_path_sum = max(max_path_sum, tmp1);

    return tmp;
    }

    int maxPathSum(TreeNode *root) {
    if (root == NULL)
    return 0;

    //int max_path_sum = INT_MIN;
    node_max_sum(root);

    return max_path_sum;
    }
    };

  • 相关阅读:
    遇见Javascript类型数组
    编译Android常用命令
    V4L2驱动视频开发要点
    Windows Phone开发(27):隔离存储A
    Ubuntu10.04下Android开发环境搭建
    V4L2开发要点
    使用 php Header 报错的一个原因
    Windows Phone开发(28):隔离存储B
    用HTML5 Audio API开发游戏音乐
    php备份数据库类分享
  • 原文地址:https://www.cnblogs.com/andy071001/p/3700491.html
Copyright © 2011-2022 走看看