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;
    }
    };

  • 相关阅读:
    算法与数据结构实验题 5.2 Missile
    算法与数据结构实验题 2.3 击鼓传花
    算法与数据结构实验题 2.4 排队
    Linux 添加自定义命令
    转 32位linux内核2.6.38.2添加系统调用,编写类似"ps"命令模块显示进程信息
    Linux内核模块程序加载方法
    Linux下sched.h文件分析
    Kali 爆破和非爆破无线路由账号和密码+让别人无线掉线
    Kali基于路由器的ARP欺骗转发机制
    Kali nmap教程用法简介
  • 原文地址:https://www.cnblogs.com/andy071001/p/3700491.html
Copyright © 2011-2022 走看看